个人学习,不对之处望请斧正
指针
直接上代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int q = 1;
int * p = &q;
printf("p表示%x\n",p);
printf("*p表示%x\n",*p);
printf("&p表示%x\n",&p);
printf("&q表示%x\n",&q);
printf("q表示%x\n",q);
printf("&*p表示%x\n",&*p);
return 0;
}
下方是输出结果
p表示61fe1c
*p表示1
&p表示61fe10
&q表示61fe1c
q表示1
&*p表示61fe1c
根据结果和代码不难看出以下几点:
p直接输出得到的是q的地址(&q)
*p直接输出得到的是q的内容
&*p直接输出得到的是q的地址(&q)
所以
p = &q
*p = q
但是也有一个特例
int main()
{
int q = 1;
int * p = &q;
printf("p表示%x\n",p);
*p++;
printf("q表示%x\n",q);
printf("p表示%x\n",p);
printf("int大小为%x",sizeof(int));
return 0;
}
p表示61fe14
q表示1
p表示61fe18
int大小为4
有意思的来了
int main()
{
int q = 1;
int * p = &q;
printf("p表示%x\n",p);
*p++;
*p++;
printf("q表示%x\n",q);
printf("p表示%x\n",p);
printf("int大小为%x",sizeof(int));
return 0;
}
p表示61fe14
q表示1
p表示61fe1c
int大小为4
通过上述代码不难发现当执行*p++时 *p并不是所谓的q,是将自己所存储的地址加上指针数据类型的大小。而执行诸如*p = *p + 1;
和*p += 1;
时却相当于q;
注:在使用int * a = 1;时代表的是a所指向的地址为1
结构体和指针
typedef struct node{
int val;
struct node *next;
}NODE;
int main()
{
NODE n1;
printf("%x\n",&n1);
printf("%x",n1);
}
61fe10
61fe00
上述代码和输出不难看出使用NODE n1;
会直接给n1分配内存控件,n1所储存是所指向的地址;n1.val可以直接获取n1结构体中val的值,结合上面的是不是可以使用 n1所指地址.val就可以获取n1结构体中val的值,这个等一下证明。
从上图可得结构体指针在声明的时候并不会给分配内存空间(它存储的内容是随机的地址);
如上图n2.val肯定是不能用的,但是
使用 n1所指地址.val就可以获取n1结构体中val的值
n2存的是n1的地址, n2 就是 n1的内容 ,n1的内容就是n1所指的结构体地址,所以n2也是n1所指的结构体地址这样的话 是不是可以直接*n2.val获取n1对应的值
果然,只不过需要加上括号。那既然*n2.val不行(*n2).val可以获取,那这样的话
括号牛逼。
终于消除了指针的种种疑问(目前来说)