求指教二维指针的问题

LLSullivan 2012-09-26 11:28:14

char **a;
char *b[3] ={"asdf","123"};
a=b;


printf("%s\t%s\n",a++,a);



为什么我这段代码每运行一次都有一个随机结果呢????却没有一次吧asdf , 123打印出来???
...全文
186 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
LLSullivan 2012-10-04
  • 打赏
  • 举报
回复
都是高手,不过。。。。。我刚注册,还没分,对不起大家了。。。。。
赵4老师 2012-09-28
  • 打赏
  • 举报
回复
电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是很多数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、……
LLSullivan 2012-09-27
  • 打赏
  • 举报
回复
不明白还是,我是菜鸟。。。。。。大侠们说的详细一点吧。。。。
AndyZhang 2012-09-27
  • 打赏
  • 举报
回复
建议你看看c语言里面指针,指针数组,数组指针
linuxblack125125 2012-09-27
  • 打赏
  • 举报
回复
二级指针和指针数组。。哈哈
hu7324829 2012-09-27
  • 打赏
  • 举报
回复
printf中%s需要的类型是char *, 所以你放char *[]是不对的.
赵4老师 2012-09-27
  • 打赏
  • 举报
回复
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是很多数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、……
赵4老师 2012-09-27
  • 打赏
  • 举报
回复
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
hu7324829 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

答案在置顶的帖子!
别看国内垃圾书!!
[/Quote]
要么这样用

printf("%s\t%s\n",a[1],a[0]);
iamnobody 2012-09-27
  • 打赏
  • 举报
回复
答案在置顶的帖子!
别看国内垃圾书!!



JiMoKuangXiangQu 2012-09-27
  • 打赏
  • 举报
回复
a --> b[0] --> "asdf"
b[1] --> "123"
AnYidan 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

不明白还是,我是菜鸟。。。。。。大侠们说的详细一点吧。。。。
[/Quote]

不是 “二维指针”是“二级指针”; 画图
AnYidan 2012-09-27
  • 打赏
  • 举报
回复
printf("%s\t%s\n",*a++,*a);
xiaoxiao8310 2012-09-27
  • 打赏
  • 举报
回复
printf("%s\n",*a);或者printf("%s =======> %s\n",a[1],a[0]);
cao_julians 2012-09-27
  • 打赏
  • 举报
回复
a=b,a获得的是&b[0]
输出a,输出地址码转化的“字符串”
应该输出的是b[0],b[1]
所以输出的是*a,*(a+1)
======================
a++,a这样的用法不规范,输出次序在不同的编译环境下是不同的。

画图困难,勉强看
"asdf","123",NULL ----------字符串常量
-|------|----|
-b[0]---b[1]-b[2]------------指针数组
-|
-a---------------------------二级指针

|看成”指向“吧
a---&b[0]
*a---b[0]---"asdf"
**a---*b[0]---'a'
JiMoKuangXiangQu 2012-09-26
  • 打赏
  • 举报
回复
void main(void)
{
char **a;
char *b[3] ={"asdf","123"};

a = b;
printf("%s\t%s\n", *a++, *a);
}


建议不要写++动作放在函数参数位置,具有不确定性.
asdjy123 2012-09-26
  • 打赏
  • 举报
回复
顶一个

野指针??
关注

69,371

社区成员

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

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