c语言指针地址的全部表示方法

2024-11-25 08:01:04
推荐回答(3个)
回答1:

朋友那本书对指针还真的没解释多少.请看下面这个例子,看了你也应该会明白了float f = 1.1; // 定义一个型的变量f,f的值为1.1;float* p = &f; // 定义一个类型的变量 p,值为&f(也就是变量f的在内存中的地址). 注意:指针也是一个变量,只是指针有点特殊,因为它只存储地址,(简单的说,指针就是一个用来存放地址的变量,)如果不懂,就继续追问.这一步你必须清楚了.*p = 3.3; // 将3.3的值付给p指向的变量.(*操作符又称作为间接值(indirect value) 或者解除引用(dereferencing)操作符.)float * p2 = p; // 定义一个指针p2让p2指向变量f.(请记住p就是一个存放地址的变量,就像普通变量一样,这条语句就是将p中存放的地址赋给p2);*p2 = *p; // 先取p指向的变量(解除引用),再取p2指向的变量(解除引用),最后将p指向的变量付给p2指向的变量,(其实这里没有任何意义,因为他们都指向变量f.这条语句相当于 f = f;)float** temp = &p; //如果对&p取地址,那么就应该用一个二级指针(**)来指向它,不然就没有任何意义. (个人认为)指针的主要用途还是体现在传递大的数据类型方面(还有一点就是他可以通过地址(指针),来改变变量的值).例如,一个很大的数组,或者一个很大的结构体,int value1[1000];typedef struct { int value2; float value3; char value4[100]; ........} test test astTest[50];千万不要以为这只是特殊的时候.其实这类复合型的数据是很常见的. 当某个函数需要调用他们时,如果直接传值调用的话...int function( int value1[1000], test astTest[50] );光是将原参数的值赋给函数的参数,就会浪费很多的内存,如果一个工程全是这样的函数,那么...很难想象.而且value1 和 astTestt的值还不会因为这个函数而改变..(不信可以试试,想要改变的话,还得将数组或作为返回值传递回来.). 但是如果用指针作为参数的话..int function2( int * value, test * astTest );这样就什么问题都OK了.慢慢体会一下...

回答2:

1、变量的地址用&运算符获取。

int a;
float b;
int *pa; float *pb;
pa = &a, pb = &b; //这里用&获取,或者说&表达式即是一个变量地址。

2、变量的地址,实际上是一个无符号整数类型。

int a = 2;
float b = 3;
if ((unsigned)&a > (unsigned) &b) 
printf("变量a的地址大于变量b的地址\n");

3、指针也是一个变量,也具备地址。

int a = 2;
int *pa = &a;
int **ppa = &pa;  //ppa保存的是指针的地址

4、其它常用的指针形式

int *pa[2]; //指针数组,有指针变量组成的数组

int a[2][2] = {1,2,3,4};
int (*pa)[2] = a; //数组指针,指向具备2个整型元素的数组。

void hello() { ; }
void (*pfunc)(void); //函数指针

void *getaddr(int var_addr); //返回类型为指针的函数

回答3:

&f表示变量f的存放地址,*f表示定义f是指针变量,而f的值是个地址。也就等于前面的&f,所以那个读文件的函数中,第一个放的是地址,先定义*f,所以把f方在那里是可以的,因为此时f值是一地址