下面c++代码中,**p什么意思、p和q显示的地址为什么一样、&p和&q表示的是什么地址?

谁能告诉我,下面的c++代码中,*p我知道表示数组arp的第一个元素地址&a,那么**p表示什么,是不是表示arp的第一个元素a的值1999?另外,p和q显示的地址为什么一样,他们表示什么地址?还有&p和&q表示的是什么地址?

*在指针里,代表着指针的等级(一个*是一级指针,2个以上也就是常说的多级指针,比如二级指针**p,三级指针***q等等),**p代表p所指向的对象是个指针(比如*w),所存储的w的地址,而不是指向一个底层变量(a=10)
w = &a;
p = &w;
**p ==a(解引用a的值)
*p == w(解引用w的值,即w所存储的a的地址)。
而在动态申请空间时(给你一段代码C的)
/*
编写一个符合以下描述的函数。首先,询问用户需要输入多少个单词。
然后,接受用户输入的单词,并显示出来,使用malloc并回答第一个问题(即要输入多少个单词)
创建一个动态数组,该数组内含相应的指向char的指针
(注意,由于数组的每个元素都是指向char的指针,所以用于储存malloc返回值的指针应该是一个指向指针的指针)。
在读取字符串时,该程序应该把单词读入一个临时的char数组,使用malloc分配足够的储存空间来储存单词
并把地址存入指针数组(该数组中每个元素都是指向char的指针)。
然后,从临时数组中把单词拷贝到动态分配的存储空间中。
因此,有一个字符指针数组,每个指针都指向一个对象,该对象的大小正好能容纳被存储的特定单词。
下面是该程序的一个运行示例:
How many words do you wish to enter? 5
Enter 5 words nou:
I enjoyed doing this exerise
Here are your words:
I
enjoyed
doing
this
exerise
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char * argv[]){
char ** p; //定义二级指针
int wordsNum; //定义单词个数
printf("你要输入多少个词?");
scanf("%d",&wordsNum); //输入单词数量
getchar(); //接受换行符
p = (char **)malloc( sizeof(char *) * wordsNum );
//动态创建指针数组,二级指针接受指针数组的首元素指针的地址,指针数组的成员数量以单词数量为准
printf("现在输入%d个单词:\n",wordsNum);
for( int i = 0; i < wordsNum ; i++ ){
int num = 1;
char ch;
p[i] = (char *)malloc( sizeof(char) );
p[i][0] = '\0';
//指针数组的成员,动态创建字符数组,先开辟一个空间
while( ( ch = getchar() ) != ' ' && ch!='\n' ){ //判断空格,可以统计出单词,单独判断换行符可以统计出一段话
if(num != 1)
p[i] = (char *)realloc(p[i],sizeof(char) * num);
p[i][num-1] = ch;
num++;
//当输入的字符不是换行符时,进入循环
//判断num的值是不是1,如果逻辑值为假时,不执行if
//如果逻辑值为真,说明已经开始接受大于1个字符数量,那么用realloc重新动态扩充原始指针数据区空间大小
//p[i][num-1] == p[0][1-0] 将ch的值赋值给p[0][1-0]
//i为指针数组的指针元素,num为字符数量,num-1为当前需要赋值的成员
//num自增
}
p[i][num-1] = '\0'; //将当前指针指向的数组的最后一个赋值为\0结束符
}
printf("\n");
//输出字串
printf("这是你输入的单词:\n");
for(int i=0;i<wordsNum;i++){
printf("%s\n",p[i]);
}
//释放指针数组所申请的动态空间
for(int i = 0; i < wordsNum ; i++){
free(p[i]);
p[i] = NULL;
}
//释放二级指针所申请的动态空间
free(p);
p = NULL;
return 0;
}
你自己看看,多理解理解追问

您看我这样的理解正确吗?

假设
C是一个变量,其值为12,地址是0x00000008;
B是一个一级指针,其值是变量C的地址,指针B的地址为0x00000004;
A是一个二级指针,其值是指针B的地址,指针A的地址为0x00000000;
那么则有
C=12; &C=0x00000008;
B=&C=0x00000008; &B=0x00000004; *B=C=12;
A=&B=0x00000004; &A=0x00000000;**A=*B=C=12;

追答

对的,一般指针的等级就用到第二级,再往上用的很少,如同数组大部分只用二维,三维略少,再往上很少见。

温馨提示:答案为网友推荐,仅供参考
相似回答