关于指针的问题,*p和**p,实在没有理解,求教!

muyangpiaomiao 2014-04-16 09:54:45
有两段代码,都是正确的,如下:
NO.1
main(){
int x,*p,**pp;
x=10;
p=&x;
pp=&p;
printf("x=%d\n",**pp);
}
NO.2

main(){
static char *ps[]={ "BASIC","DBASE","C","FORTRAN",
"PASCAL"};
char **pps;
int i;
for(i=0;i<5;i++){
pps=ps+i;
printf("%s\n",*pps);
}
}
l两段代码中最后一句分别用了**pp和*pps,明显意义不同,为何输出却又是正确的,我自己在分别修改**pp为*pp和*pps为**pps之后没有得到合理结果,求知道的解释下,万分感激!
...全文
185 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
muyangpiaomiao 2014-04-16
  • 打赏
  • 举报
回复
引用 3 楼 mcmay 的回复:
[quote=引用 楼主 u014496787 的回复:] 有两段代码,都是正确的,如下: NO.1 main(){ int x,*p,**pp; x=10; p=&x; pp=&p; printf("x=%d\n",**pp); } NO.2 main(){ static char *ps[]={ "BASIC","DBASE","C","FORTRAN", "PASCAL"}; char **pps; int i; for(i=0;i<5;i++){ pps=ps+i; printf("%s\n",*pps); } } l两段代码中最后一句分别用了**pp和*pps,明显意义不同,为何输出却又是正确的,我自己在分别修改**pp为*pp和*pps为**pps之后没有得到合理结果,求知道的解释下,万分感激!
NO1 pp = &p; p = & x; int x = 10; ** pp = **(&p) = *p = *&x = x 而将 **pp 改为 *p后 *pp = *(&p) = p = &x != x NO 2 char **pps pps = ps + i *pps = *(ps + i) = ps[i],即字符串二维数组当中的每个字符串的首地址,用%s输出,则是相应的字符串 **pps = **(ps + i) = *(ps[i]) 而ps[i] = &ps[i][0] 所以*(ps[i]) = *(&ps[i][0]) = ps[i][0] ps[i][0]是个字母,后面没跟'\0',但用%s输出,因此结果不可预测。[/quote] 原来指针是用这样的方法分析的呀,受教了,谢谢!
漂浮一生 2014-04-16
  • 打赏
  • 举报
回复
引用 1 楼 bbs2241 的回复:
1 我自己在分别修改**pp为*pp *pp是什么,这是个指针,printf("x=%d\n",*pp); %d将指针的内容打印出来了,这个指针的内容是指向x的地址的 2 和*pps为**pps之后没有得到合理结果,求知道的解释下,万分感激! **pps是什么,是字符,printf("%s\n",**pps); %s是将字符串打印出来,而你传给print的是字符,结果是什么,oh no......... access violation
有个问题,想要打印一个地址的类容使用%p,而不是%d
muyangpiaomiao 2014-04-16
  • 打赏
  • 举报
回复
引用 2 楼 u014496787 的回复:
[quote=引用 1 楼 bbs2241 的回复:] 1 我自己在分别修改**pp为*pp *pp是什么,这是个指针,printf("x=%d\n",*pp); %d将指针的内容打印出来了,这个指针的内容是指向x的地址的 2 和*pps为**pps之后没有得到合理结果,求知道的解释下,万分感激! **pps是什么,是字符,printf("%s\n",**pps); %s是将字符串打印出来,而你传给print的是字符,结果是什么,oh no......... access violation
谢谢热心帮助,按照你的解释我理解了这样的修改是不对的,另外我也知道第一种情形是要以指针变量的方式输出数据,但是对第二种还不甚理解,*pps不是char型没错,可是难道是指针变量吗?[/quote] 刚发出去,我再看了下代码,大神帮我看下是不是这样的:“ps返回指针,ps+i返回i行即第i+1个字符串的首地址,即pps返回第i+1个字符串的地址,*pps成为指针变量型,返回地i+1个字符串。”
mcmay 2014-04-16
  • 打赏
  • 举报
回复
引用 楼主 u014496787 的回复:
有两段代码,都是正确的,如下: NO.1 main(){ int x,*p,**pp; x=10; p=&x; pp=&p; printf("x=%d\n",**pp); } NO.2 main(){ static char *ps[]={ "BASIC","DBASE","C","FORTRAN", "PASCAL"}; char **pps; int i; for(i=0;i<5;i++){ pps=ps+i; printf("%s\n",*pps); } } l两段代码中最后一句分别用了**pp和*pps,明显意义不同,为何输出却又是正确的,我自己在分别修改**pp为*pp和*pps为**pps之后没有得到合理结果,求知道的解释下,万分感激!
NO1 pp = &p; p = & x; int x = 10; ** pp = **(&p) = *p = *&x = x 而将 **pp 改为 *p后 *pp = *(&p) = p = &x != x NO 2 char **pps pps = ps + i *pps = *(ps + i) = ps[i],即字符串二维数组当中的每个字符串的首地址,用%s输出,则是相应的字符串 **pps = **(ps + i) = *(ps[i]) 而ps[i] = &ps[i][0] 所以*(ps[i]) = *(&ps[i][0]) = ps[i][0] ps[i][0]是个字母,后面没跟'\0',但用%s输出,因此结果不可预测。
muyangpiaomiao 2014-04-16
  • 打赏
  • 举报
回复
引用 1 楼 bbs2241 的回复:
1 我自己在分别修改**pp为*pp *pp是什么,这是个指针,printf("x=%d\n",*pp); %d将指针的内容打印出来了,这个指针的内容是指向x的地址的 2 和*pps为**pps之后没有得到合理结果,求知道的解释下,万分感激! **pps是什么,是字符,printf("%s\n",**pps); %s是将字符串打印出来,而你传给print的是字符,结果是什么,oh no......... access violation
谢谢热心帮助,按照你的解释我理解了这样的修改是不对的,另外我也知道第一种情形是要以指针变量的方式输出数据,但是对第二种还不甚理解,*pps不是char型没错,可是难道是指针变量吗?
bobo_包子 2014-04-16
  • 打赏
  • 举报
回复
1 我自己在分别修改**pp为*pp *pp是什么,这是个指针,printf("x=%d\n",*pp); %d将指针的内容打印出来了,这个指针的内容是指向x的地址的 2 和*pps为**pps之后没有得到合理结果,求知道的解释下,万分感激! **pps是什么,是字符,printf("%s\n",**pps); %s是将字符串打印出来,而你传给print的是字符,结果是什么,oh no......... access violation

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧