指针问题!

sharkhuang 2003-11-19 01:38:00
int **p;
p = (int **)malloc(2*3*szieof(int));
如果p = ox1000;
p[1] = ??
...全文
90 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharkhuang 2003-11-23
  • 打赏
  • 举报
回复
越来越对了!容易懂了
GR 2003-11-22
  • 打赏
  • 举报
回复
这两种本质都是一样的。也就是p的值为开辟内存区的首地址。p[1]就是开辟内存区的第二个地址的值,就如楼上的所说只是初始化和未初始化的区别
RainWindy 2003-11-22
  • 打赏
  • 举报
回复
第二个问题如大家所说,我只谈第一个问题:
我经过debug得出以下结果
p=0x1000,
则p[1]的地址(等同于p+1)是0x1004,因为int*为4个字节(在VC下,如果使用16位编译,则为0x1002)
2*3*sizeof(int)=24个字节,也就是[0x1000,0x1017]为有效地址,所以p[1]是指向了有效地址,但p[1]只是0x1004指针处4个字节的值,由于malloc分配内存时不会初始化,所以p[1]是随机的,
但如果改成p = (int **)calloc(2*3,szieof(int));
则在内存区[0x1000,0x1017]的值是全为0,所以这时候p[1]=0,请大家再去调试,就是这个结果。
sharkhuang 2003-11-22
  • 打赏
  • 举报
回复
继续啊!
Rossonero 2003-11-21
  • 打赏
  • 举报
回复
从2*3*szieof(int)看不出是2维的,只是分配后强制转换了.
因此和int *t=malloc()没本质的区别.
这里只是用t访问变量单元,而楼主是用(*p)访问而已.
skylucker 2003-11-21
  • 打赏
  • 举报
回复
malloc 和 new是不是一个意思?那个地方还成new是不是一样?
GR 2003-11-21
  • 打赏
  • 举报
回复
不管怎么变。N维也好。最终是化为一维,给了一个指针之后。指针就可以全盘访问了。
cyj2008 2003-11-21
  • 打赏
  • 举报
回复
p[1]=0x100c
coppermine 2003-11-21
  • 打赏
  • 举报
回复
友一个例子
#include <iostream.h>
void main()
{
int a[4] = {1,2,3,4};
int **********pp = (int**********)a; // 无论多少个*,结果都一样
for (int i=0; i<4; i++) cout<<(int)(pp[i])<<endl;
}

和前面的比较一下,因该可以看得出其本质了吧。
GR 2003-11-21
  • 打赏
  • 举报
回复
靠。是我错了。p[1]是a[0][1]的值。
coolduckplus 2003-11-21
  • 打赏
  • 举报
回复
学习
GR 2003-11-21
  • 打赏
  • 举报
回复
又仔细看了一下。p[1]是a[0][1]的地址。
sharkhuang 2003-11-21
  • 打赏
  • 举报
回复
呵呵!你是一位的用法!只是强行转换了而已!
你的PP如果是双指针!那要打他的值其实是 *pp【1】;又是乱东西!
GR 2003-11-20
  • 打赏
  • 举报
回复


p[1]根本无法回答的。只是一个中间量而已。无法用具体数值描述的。
sharkhuang 2003-11-20
  • 打赏
  • 举报
回复
凡是回答 p【1】是一堆垃圾的人都是对的!而且是把指针吃透了的!:)
coppermine 2003-11-20
  • 打赏
  • 举报
回复
to sharkhuang(爱情和程序都读不懂) 我的结论和你正相反,呵呵.

一个例子
#include <iostream.h>
void main()
{
int a[4] = {1,2,3,4};
int **pp = (int**)a;
for (int i=0; i<4; i++) cout<<(int)(pp[i])<<endl;
}
kyle245 2003-11-19
  • 打赏
  • 举报
回复
malloc(2*3*szieof(int));与malloc(6*szieof(int));没区别吧?
coppermine 2003-11-19
  • 打赏
  • 举报
回复
注意,设 T *p, 那么p[i] == *(T*)((BYTE*)p + sizeof(T))
该例中,T为一个指针,sizeof(T)==4;

一个容易混淆的地方是,这里没有数组的概念。指针指向数组的例子:

char *p = a[N];
char (*p)[N] = a[X][N]; X--为任意值,N为定值 p[a1][b] == a[a1][b];
高维数组类推。

C语言不检查数组是否越界,所以当把数组付给指针时,第一维的大小时没有用的。但其它维的信息是必需的,因为指针运算需要他们。
xdhust 2003-11-19
  • 打赏
  • 举报
回复
未初始化的值
warm_hcb 2003-11-19
  • 打赏
  • 举报
回复
还是我哥哥牛,一下指出p[1]表示的是a[0][1]的值。

p[1] = *(p+1),p指向的是一个(int*)的指针,
所以p+1表示指针向前移动4个字节,然后再取值,
因为p表示的是a[0][0]的地址,而数组是int型,所以p+1表示的是a[0][1]的地址,
*(p+1)就表示a[0][1]的值。
加载更多回复(19)

69,371

社区成员

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

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