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

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

第一个程序
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指向的第一个字节往后算两个字节取内容

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

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

#include int main(int argc, char *argv[]){ char *strings[]={"123","456","789"}; char **p; p = strings; printf("[%c] [%s]
", **p, *p); return 0;}打印信息是[1] [123]很正常嘛,完全正确啊,没啥异常。
我知道了,你可能有误解,**p不是指向string[0],而是指向string[0][0], *p才是指向string[0]

第一条改成

int a[10][20],*p=a[0];

二维数组本来就是以为数组,二级指针是指针的指针,不同概念

char *a[]={"a","b"};
char **p=a;

这里定义了一个指针数组,里面保存了两个地址,一个是字符串a的首地址,一个是字符串b的首地址,然后数组的首地址a,这样用一个二级指针才能访问,这就是所谓的指针的指针

int a[2][2]={1,2,3,4};
int (*p)[2]=a;
(*p)[2]的意思是,p是一个指针变量,只想一个有两个元素的一位数组,这不刚刚就是二维数组的首地址吗?所以这个(*p)[2]是可以指向二维数组首地址

*p[2]的意思是,定义一个数组,里面有两个指针元素,这和"[]","*"运算符优先级有关的

C语言二级指针问题。
答:二级指针和二维数组是两码事 你把 getSomething函数的参数类型改成char(*)[100]就可以了 就是这样:void getSomething(char(*records)[100]){ records[0][0] = 'I';records[0][1] = 'n'//这两句段错误;}

c语言二级指针中二级指针p,*p是地址还是值,为什么有的时候就是值而不...
答:对于一级指针而言,*p是取值,对于二级指针而言,*p是取地址,但是地址又是无符整形数据,所以在二级指针中你把*p当值来用的话,编译不报错,但是不合规定。

在c语言中用二级指针指向一维数组,为什么“*变量名”与数组名的值不一...
答:二级指针不能只想一维数组取地址.对于char buf[10];&buf是数组指针 char (*p)[10] 类型和char **不匹配. 所以会出错.

c语言问题,二级指针的指向是怎样的,以及后面那个p++的含义,多谢了
答:先看*p[5],它定义了一个指针数组,一个含有5个元素的一维数组,不过元素的值p[0]、p[1]、……都是指针。再看**pp=p,pp是一个二级指针,它是指向指针的指针(本例中它指向p),其值为p的地址。*pp则是p的值,即p[0]的地址。**pp则是p[0]的元素值。当执行**p++时,依次得到p[0...

c语言指针选择题求解
答:1.选C。int a,*p;定义了一个整型变量a以及整型指针p;因此p=&a;p可以存放a的地址。2.选B。int a,*p=&a;因为a是一个变量,不存在*a这一个用法。3.选D。pp未定义错误。C是正确的,p1、p2以及p都是整型指针。4.a是整型变量,p是一级指针a的地址。q是二级指针p的地址。5.q指向null。

一道简单的C语言二级指针题,求各位大佬帮忙看一下哪里错了,输不出...
答:scanf("%d",&x);char *a[x]={0};c语言不支持这样定义不定长数组。可用以下方法 scanf("%d", &m);int *p= (int*)malloc(m*(sizeof(int)));;memset(p, 0, m);

C语言二级指针奇葩问题
答:很正确啊,看下面两句就应该清楚了吧?注意p是二级指针,并不直接指向{W...} str[2]= p[1] + 3;//这时p[0]指向str[2],p[1]指向str[3],即最终内容是Nanjing;p[1] + 3最终内容就是jing;你把str[2]通过执行p[1] + 3指向了jing,而p[0]是指向str[2]的;由于*p就是p[0],...

c语言指针与数组问题。在以下程序中为何二级指针的初始化赋值有错,求...
答:你的p声明和赋值的时候有问题,因为a本身就是地址,所以不要&a,而a本身是指向3维数组的数组,那么不能用任意类型的指针的指针来获取,应该用指向三维数组的指针 include <stdio.h> int main() { int a[][3] = { {1, 2, 3},{4, 5, 6},{7, 8, 9} };int (*p)[3] = a;while...

一个C语言二级指针的问题
答:exit(1);//这里为什么要返回1??//为什么不加上括号就不行?程序退出时一般要返回一个数给操作系统,返回0表示程序运行正确,否则表示程序出错。exit()是一个函数,所以必须加括号,表示函数调用

C语言 如图 关于二级指针的题 选C我能看出来 但是我不明白A和D时怎么...
答:p是指针数组,所以是二维 pp是指针的指针,所以也是二维