关于对指针进行&运算

jiaoyun007 2018-11-21 08:33:49
各位好,
遇到个迷惑不解的问题,一直以为对一个指针进行取地址运算,得到的值是它自己,也就是说,假如有以下定义:

char *p;

,那么应该p=&p,但是实际却不是这样,这是怎么回事呢?p和&p到底有什么区别呢,多谢各位!

测试代码如下:

void func3()
{
int i=0;
char *p1=0, *p2;

printf("\n p1 = 0x%08x, and &p1 = 0x%08x\n", p1, &p1);
printf("\n p2 = 0x%08x, and &p2 = 0x%08x\n", p2, &p2);

p1 = "abc";
p2 = "abc";


printf("\n the address of string abc is 0x%08x\n ", "abc");
printf("\n p1 = 0x%08x, and &p1 = 0x%08x\n", p1, &p1);
printf("\n p2 = 0x%08x, and &p2 = 0x%08x\n", p2, &p2);
}

void main()
{
func3();

}

,运行结果是

  p1 = 0x00000000, and &p1 = 0x0061ff18

p2 = 0x00401c00, and &p2 = 0x0061ff14

the address of string abc is 0x0040512d

p1 = 0x0040512d, and &p1 = 0x0061ff18

p2 = 0x0040512d, and &p2 = 0x0061ff14
...全文
607 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
九都多平 2018-12-01
  • 打赏
  • 举报
回复
C语言的核心灵魂就是指针,这是其他语言所没有的。
油菜花的菜 2018-11-26
  • 打赏
  • 举报
回复
引用 28 楼 qq_43807092的回复:
[quote=引用 3 楼 jiaoyun007的回复:][quote=引用 1 楼 qq_40260025 的回复:] 定义一个指针: char *p; 它此时代表一个地址,因为你没有对它初始化,所有它指向的地方可能非法,但你仍然可将它看作一个地址。 而 &p 就是对指针取地址,即地址的地址。
p已经是内存区间一个具体地址了,那它地址的地址,指的什么呢?[/quote] P为0*00000000作为指针时是一个地址。[/quote] 对p取地址时,这时p是一个数,相当于对这个数取地址。
油菜花的菜 2018-11-26
  • 打赏
  • 举报
回复
引用 3 楼 jiaoyun007的回复:
[quote=引用 1 楼 qq_40260025 的回复:] 定义一个指针: char *p; 它此时代表一个地址,因为你没有对它初始化,所有它指向的地方可能非法,但你仍然可将它看作一个地址。 而 &p 就是对指针取地址,即地址的地址。
p已经是内存区间一个具体地址了,那它地址的地址,指的什么呢?[/quote] P为0*00000000作为指针时是一个地址。
油菜花的菜 2018-11-26
  • 打赏
  • 举报
回复
引用 3 楼 jiaoyun007的回复:
[quote=引用 1 楼 qq_40260025 的回复:] 定义一个指针: char *p; 它此时代表一个地址,因为你没有对它初始化,所有它指向的地方可能非法,但你仍然可将它看作一个地址。 而 &p 就是对指针取地址,即地址的地址。
p已经是内存区间一个具体地址了,那它地址的地址,指的什么呢?[/quote] *是指向的意思?,求解
ZSM_KP 2018-11-25
  • 打赏
  • 举报
回复
你就把char*看作数据类型,取地址是一种运算,p本身存储的是一个字符串的首地址,而对p取地址之后,得到的就是p对应存储单元的地址,是char**类型
Mintggg 2018-11-25
  • 打赏
  • 举报
回复
*p 是一个指针,所指向的存储空间的地址存在p中。&p的话就是p的地址,也即存 指向存储空间地址 的存储空间的地址。
zhou09168 2018-11-23
  • 打赏
  • 举报
回复
感谢分享,小白刚好学到指针
神童i 2018-11-23
  • 打赏
  • 举报
回复
char *p; 这是定义一个变量;既然是定义变量那么这个变量(变量名是p,类型是char*)就有一个内存空间,这个内存空间就有一个地址,这个地址就是变量p的地址,即&p. p的类型是char*也就是说p是个指向char类型数据的指针,p中存放的数据是一个char类型数据的地址,而&p,也就是p的地址,p是char*类型,&p类型就是char**, 所以如果要存放&p应该用char **pointer;来存放,意思是pointer是个指针, 存放的地址类型是char*类型数据(p)的地址(&p)。 或者简单地说p这个指针是来存放别人的地址的,&p是p自身的地址(因为p也是个变量,也有内存空间)。
赵4老师 2018-11-22
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
午后是傻狗 2018-11-22
  • 打赏
  • 举报
回复
插嘴一句,指针搞不明白,,,,学习c很艰辛
英雄@末路 2018-11-22
  • 打赏
  • 举报
回复
指针取地址就是二维指针,再取地址就是三维了,嘿嘿
进击的cxy 2018-11-22
  • 打赏
  • 举报
回复
char *p 相当于定义一个变量p的指针(可以理解同时做了定义变量p和变量p的指针两件事),可以是值或者字符串之类的,而&p表示这个获得变量p在内存中的存储地址,是一个固定的值,也就是获得*p所指向的地址值。 所以你的函数中&p1,&p2作为一个地址值一直没变,而p1与p2则随着你的定义与赋值而变。 仅个人理解,有问题请指出。
自信男孩 2018-11-22
  • 打赏
  • 举报
回复
p1对应的是指针变量里的值,&p1是指变量p1的地址,这个地址是栈上的地址,因为p1是局部变量。
由于p1指向0,即指向NULL,那就是0地址;&p1就是一个函数func3栈上的地址;
p2指向的地址是随机的,所以输出p1的地址是一个随机的地址,&p2和&p1一样是局部变量,并且是挨着的,所以地址值相差4(32位系统);


下面p1, p2都指向了"abc"的首地址,因此输出的p1, p2是相同的,同样&p1, &p2的地址没有变化那也是上面一样的值。
真相重于对错 2018-11-22
  • 打赏
  • 举报
回复
引用 3 楼 jiaoyun007 的回复:
[quote=引用 1 楼 qq_40260025 的回复:]
定义一个指针: char *p; 它此时代表一个地址,因为你没有对它初始化,所有它指向的地方可能非法,但你仍然可将它看作一个地址。
而 &p 就是对指针取地址,即地址的地址。

p已经是内存区间一个具体地址了,那它地址的地址,指的什么呢?[/quote]
形成了一个临时变量。
636f6c696e 2018-11-22
  • 打赏
  • 举报
回复
指针实质是一段数字 对指针取地址就是获取这段数字在内存中的位置
jiaoyun007 2018-11-22
  • 打赏
  • 举报
回复
结贴了,谢谢各位!
jiaoyun007 2018-11-22
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
十字链表交换任意两个节点C源代码(C指针应用终极挑战)http://download.csdn.net/detail/zhao4zhong1/5532495
好好看看!!
jiaoyun007 2018-11-22
  • 打赏
  • 举报
回复
引用 12 楼 sinat_37764097 的回复:
这个问题的确能让初学者头疼,
多谢画图!!
赵4老师 2018-11-22
  • 打赏
  • 举报
回复
十字链表交换任意两个节点C源代码(C指针应用终极挑战)http://download.csdn.net/detail/zhao4zhong1/5532495
赵4老师 2018-11-22
  • 打赏
  • 举报
回复
引用 16 楼 jiaoyun007 的回复:
[quote=引用 11 楼 zhao4zhong1 的回复:]
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

您是大鳄,哈哈![/quote]
加载更多回复(9)

69,373

社区成员

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

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