c语言中,我定义 int **p,和*a和b,其中*p的含义是什么,我让**p指向*a,*p指向b

c语言中,我定义 int **p,和*a和b,其中*p的含义是什么,我让**p指向*a,*p指向b这种事行得通么

p 是一个指向整型指针的指针,*p 是一个指向整型的指针, **p = *(*p)是一个整型数
a 是一个指向整型的指针,*a 是一个整型数
b 是一个整型数
所以:
**p = *a 可行,但是注意不是”指向“,是将 *a这个值赋值到*p这个地址
*p = b 不可行,因为*p是指针,b是整型数追问

*p是指针,那么p里面存的是什么呢

追答

p也是一个指针,它存的是*p的地址
给你举个例子:
我想找你朋友小王说个事,但是我不知道怎么找他,你好久不联系他也不知道他在哪,但是你知道他妈妈的联系方式,于是你就帮我问他妈妈。
这个情景下,你就是p, 小王的妈妈是 *p, 小王是 **p,而我就是企图访问 **p的某段代码

哎,也许你更糊涂了…………

追问

我是用普通指针去类比二级指针的...指针*p是p指向的变量....可是我在练习字符串的时候,我定义了一个字符串g,我用的strcpy函数一开始写的(*p,g)是错误的,后来我改为(p,g)这段代码才正常执行的,我突然就不理解了,g不就是字符串,为什么能赋值给p呢而不能给*p,你的例子我看明白了,清楚了很多,可我不明白为什么p能代表字符串

追答

请上代码

追问

好的

一开始我写的strcpy(*(p+b),g)

追答

首先,图片里的代码肯定是错的,我不知道为什么strcpy(p+b, g)能够通过编译;

程序之所以出错是因为还有其它错误:

    两个for循环都越界了,应该都改成 for (b=0; b < a; b++)

    strcpy(p+b,g)应该改成 *(p + b) = g;

    printf("%s", p+b) 改成 printf("%s", *(p+b));

    另外程序最后应该free之前malloc的内存。当然这个不影响你的程序编译运行

追问

哦哦这样,就是说虽然我这个和我的目的是相符的但完全没有道理,我开始理解的strcpy(*(p+b),g)如果配合正确的for是能够运行的是这个意思嘛

追答

strcpy(*(p+b),g)不能运行,因为你没有给 *(p+b)指向的地址分配内存,就不能向其中复制数据

追问

那么我能不能不谢g,直接给*(p+b)分配内存把字符串写在*(p+b)里

追答

可以

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-19
int **p ;
int *a;
int b;
如果这样定义, a, b,p都是变量; 只不过b 是int 变量; b 是 指针变量(指针指向int) ; p 也是指针变量(指向了一个指针,这个指针又指向了int)
所以
取b的地址给a ; a = &b;
取a的地址给p ; p = &a;

对 b赋值 ; b = 1;
对a 指向的空间赋值 ; *a = 2;
对p 指向的空间赋值 *p = a; (此时,那个空间存放了a的值,这个值是一个地址)
如果你还想为这个地址所指向的空间赋值 **p = 44;

这里我们可以看到有那么一个空间,我却没有用a,b,p表示出来,那个空间,需要初始化。否则,你就有非法值。追问

额,我看的不是很懂,我的意思是我定义一个二级指针**p,那么我的*p和p有意义么,如果有意义那么*p和p分别都代表着什么

如果我让**p=*a,那么此时*p和p里面存的东西是什么,或者说*p和**p和p没关系我可以随意赋值

追答

如果定义了int **p; 那么p 和*p 都是有意义的;
甚至**p; &p都是 有意义的;
如此,p 表示一个变量; 只不过这个变量表示的类型是int的二级指针; 和int的区别;就像int和float的区别一样; 他们是一种变量类型; p的类型是: int的二级指针;
*p 本身就表示p指向的那个空间的值(这个空间,未初始化,但是编译器只管语法;错误是运行时候的问题; 这个空间,有个类型,这个类型是int的指针,或者int的一级指针;通常我们不说一级;)

第二小问,我就不回答了;因为你思考的方向就错了

你得想想,我们必须站在编译器的角度考虑问题;你假设你就是编译器;这个是你考虑问题的关键

你要记住,那个“空间”也就是内存空间; 和那个“符号”(这个是编译器的说法,C语言说法就是那个“变量” 其实不是很准确,后面我介绍)
这2个概念是有区别的;

“空间”那是实实在在的存储内容的内存区域(也许这个区域不合理,也许非法,但是从编译器的角度上看,那就是实实在在的内存空间);
“符号”就是编译器,看到你写的那几个字母,它要怎么认为;他把那几个字母;看成一个“空间”还是和这个空间有关的概念;

比如说 你写了int *p;这个代码; 编译器;看到了p这个字母;他就知道有一个实实在在的空间; 并且这个“空间”有个“符号”叫作p;
当你接下去写 &p ; 编译器又看到了2个字母"&p" 但是这个他认为的符号,没有使用“空间”而是原来那个叫p的空间的地址;

如果你接下去写*p = 3; 编译器依然没有看到新的空间; 他看到了 *p 这样的符号; 和 = 的赋值; 他把*p 符号看出叫p的空间,里面的值,当做地址;那个空间的符号;
至于那个“空间”合法不合法;编译器不关心;但是他知道;那个空间叫*p;
好了; 就这么多

第2个回答  2015-11-19
int **p,*a,b; //这里定义了三个变量 p,a,b ;p是int** 型,也就是二级指针,a是int*型,一级指针,b是int型,*p表示取出变量p的值(是一个地址)处对应的值啊(是一个int*的值), **p 指向*a ??? 没有这种说法,不专业,**p表示的是变量p的值(地址)处对应值(地址)处的值啊,p可以指向a的存储单元,就是p=&a,而p不能指向b,因为b是int型,而&b 是int*型,p是int**型,要想硬性指向,使用强转,p=(int**)&b;这样就可以,但是要注意使用**p的值,如果b不是存储的一个有效地址的话,会导致非法内存访问。追问

嗯嗯是不专业我大一新生就学了一个月都自学的,我就是搞不懂如果我定义了**p,那么*p和p和**p是否有关系,或者说完全没关系呢