指针问题及由此引出的问题

sxrj 2003-08-23 04:44:41

对于指针我还想搞得更明白一些,于是又有了新的问题:
NODE *u
u=(NODE *)malloc(sizeof(NODE))
此处申请了一个大小是NODE的内存空间
int *b
b=(int *)malloc(sizeof(int) * (m+1));
此处m=5,但我不知道sizeof(int)后边的 * (m+1)应当怎么理解?它到底申请了多大的内存空间?* (m+1)在此处的功用是什么?

程序
int i[]={1,5,9};
int *q;
q=i;
printf("%d",*q);
printf(" \n %d",q);
printf( "\n %d",&q);
printf ("\n %p",q);
printf("\n %p",&q);
printf("\n %X",q);
printf("\n %X",&q);
输出:
1
-44
-38
FFD4
FFDA
FFD4
FFDA

我的问题是使用&以后和不使用&到底输出的是什么,那个才是内存地址?二者有没有关系,似乎它们有个相对比较小的差值。
使用P是输出指针的值,而这个值应当是内存地址的值对吗?如果说它们是内存地址,那么用X也是输出内存地址了,对吗?另外P与X两个输出格式参数之间有什么关系?当然我知道X是输出无符号以十六进制表示的整数,P是输出指针的值,我的本意是此处它们有什么区别,它们本质区别又是什么?关于这个问题我又进行了如下测试,不知能否在回答上边问题以后再把以下输出结果分析一下?
int a=3;
printf("%p \n",a);
printf("%p \n",&a);
printf("%x \n",a);
printf("%x \n",&a);

0003
FFDA
3
ffda

当然这些输出格式的参数不应当如此使用,在此我完全是希望能够正确区分两个参数的功用。 最后写一句,由于我还进行了别的测试,测试例子太杂,我没有都写出来,个人感觉是P是输出了一个标准的4位长度数的16位数,首位不足补零,而X也是输出16位数,但它使用实际数据的长度。仅仅是格式上的区别,没有什么本质上的区别,当然由于我的测试带有个人的片面性,肯定有不正确的地方,得出的结论也肯定有问题,希望能够得到指正。

...全文
31 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellobcb 2003-09-01
  • 打赏
  • 举报
回复
优先级:++>*>+
sxrj 2003-08-31
  • 打赏
  • 举报
回复
是分太少吗?
sxrj 2003-08-27
  • 打赏
  • 举报
回复
(*p)[4]表示p为指向4个元素的一维数组的指针变量,当它指向k[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}时它应当能够通过p=k;p=k+1;p=k+2;p=k+3;分别指向以1,5,9,13为首的不同的4行对吗?如果可以,那么它可以指向分别以1,2,3,4为首的不同的4列吗?如果可以代码怎样写?当p=k以后我做了如下测试:使用 for(i=0;i<4;i++)
printf("%d",*(*p++))后输出1,5,9,13;使用 for(i=0;i<4;i++)
printf("%d",*(*p+i))后输出1,2,3,4,这里有个问题产生了p++为什么不等于p+i,它们不都是加1吗?
Healer 2003-08-24
  • 打赏
  • 举报
回复
b=(int *)malloc(sizeof(int) * (m+1));
这个通常用来处理地址连续的线性表, 用处不大。
和一楼的老大说的是一样的, 数组就是一种线性表,。
晨星 2003-08-23
  • 打赏
  • 举报
回复
b=(int *)malloc(sizeof(int) * (m+1));
那显然是申请了m+1个整数大大小的空间啊,如果在32位系统中,sizeof(int)为4,所以就相当于:
b = (int*)malloc(24);
显然这块空间可以装下6个整数,因此在效果上可以当作
int b[6];
来使用。

p是个指针变量,输出p就是输出这个指针指向的地址的值,而指针变量的值就是它指向的地址的值。
指针变量本身也是个变量,只要是变量,那么它本身也需要有内存空间来保存它的值,而&p就是这块内存的地址。
在这一点上,指针变量和数组名是不同的。比如说,
int a[6];
那么a和&a是一样的,原因是数组名仅仅是个常地址,而不是个指针变量,C/C++规定&a和a含义相同。

我觉得"%p"和"%x"的区别很小,原因是大家习惯于用16进制来显示地址,而不是10进制或8进制。"%x"是输出16进制数(a到z小写),而"%p"是按一种大家习惯的标注格式来显示16进制数,即固定4位16进制数(正好表示32位二进制地址),a到z大写,也就是说,"%p"相当于"%04X"。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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