关于c语言二级指针的一个问题

2025-05-09 00:57:05
推荐回答(3个)
回答1:

因为int *c;和c =(int*) &b;造成了c不是二级指针而是int *型指针,而且其内容*c并没有地址的意义而是一个普通的int型数值,要把这个int型数值用(int*)强制成为指针(地址)才能从中用*“取出”变量a来。当然,如果把*c直接打印出来,其数字就是a的地址数,但它不具备“指针”的“能力”——就是说编译器不把它当地址对待,从中用*取值要报错——这说明一个问题:就是指针不单单是个地址数值,还承载着很多必要的其他信息(比如int *型指针++会跳过4字节,char *型指针++却只跳过1字节,这就是它们承载的其他信息不同)。不然,分什么int *型指针、char *型指针、struct *型指针……还有什么意义?它们不都只是个4字节的无符号整数吗?

回答2:

第一个程序
c中存的是b的地址
*c中存的是a的地址
**c等价于a
**c表示为一个二级指针 如果程序是这样
int a=5;
int **c;
c = &a; 那么c中存的是a的地址 **c表示的是以a中的内容作为地址的一个内存(开始a为5 就是指向地址为5的空间)所以访问**c的时候就会出错 所以记住**c已经在编译过程中默认为了一个指向指针的指针 c的值是*c的所指向变量的值作为的地址

第二个程序*c是一个一级指针 **c并不知道指向的是一个什么类型的指针,所以必须要进行强制转换 也就是告诉编译器 它指向的类型
c =(int*) &b; 这个地方&b本身是一个指针的地址 是个指针常量 需要强制转换
*(int*)(*c) 需要告诉编译器*c中存储的是一个整型指针

还有一个需要补充一下的 char占据的是一个字节 int是两个 指针指向的都是第一个字节 但是如何把里面的位联系起来呢?就需要指定一个变量类型 比如第一个内存中是00000000 第二个内存中是00000001 char和int都指向第一个内存 (int*)&a就会把第一个内存和第二个内存一起算上
(char *)&a就只会计算第一个内存 故(int*)&a是1(char *)&a是0(这里是做一个假设,实际情况并不会发生)
所以我们来看第二个程序,强制转换并不是改变了什么 只是告诉编译器 在计算内存的时候需要从*b指向的第一个字节往后算两个字节取内容

回答3:

因为C不是二级指针,(*C)拿出来的是一个地址指针,如果前面直接再加*号*(*C)那么编译器就不知道(*C)代表的地址所指向的数据是什么类型,也就是不知道(*C)所指向的内存有多大。所以要把(*C)前面加上一个强制类型转换(int*)(*C)这样就知道是指向的为整形数据内存,然后再在前面加*,*(int*)(*c)也就是这块地址所代表的内容,这样就相当于使用变量了。明白了吗?