c语言关于学指针刚开始的一个小问题
#include<stdio.h>intmian(){inta;int*b;b=&a;printf("%x",b);return0;}这个和下面那个差别在于上面这个声明定...
#include<stdio.h>
int mian()
{
int a;
int *b;
b = &a;
printf("%x", b);
return 0;
}
这个和下面那个差别在于上面这个声明定义了一个指针变量……这两个本质区别在哪?是不是都可以输出a所在地址?(请无视有没有赋值赋值)
#include<stdio.h>
int mian()
{
int a;
int b;
b = &a;
printf("%x", b);
return 0;
} 展开
int mian()
{
int a;
int *b;
b = &a;
printf("%x", b);
return 0;
}
这个和下面那个差别在于上面这个声明定义了一个指针变量……这两个本质区别在哪?是不是都可以输出a所在地址?(请无视有没有赋值赋值)
#include<stdio.h>
int mian()
{
int a;
int b;
b = &a;
printf("%x", b);
return 0;
} 展开
展开全部
没啥区别。指针变量其实就是个整数(其实是无符号整数unsigned int,不过高位系统里可能已经是unsigned long long了),里面一般用来存地址罢了。
所谓地址,也就是内存的一个存储单元的编号,其实就是整数啦。
好比a变量的值存在了第123456个内存单元里,a的地址就是123456,b变量里存了123456这个值。
第一段代码可以通过*b取到a的值(第123456个内存单元里的值)。
所以对于第二段代码,同样也能通过 *((int*)b)取到a的值(也是第123456个内存单元里的值)。
至于(int*),因为int是四个字节的,就是说要一下子取4个字节,就是说明一下,在取*的时候,把123456, 123457, 123458, 123459这四个内存单元里的值拿出来拼成一个int。
所谓地址,也就是内存的一个存储单元的编号,其实就是整数啦。
好比a变量的值存在了第123456个内存单元里,a的地址就是123456,b变量里存了123456这个值。
第一段代码可以通过*b取到a的值(第123456个内存单元里的值)。
所以对于第二段代码,同样也能通过 *((int*)b)取到a的值(也是第123456个内存单元里的值)。
至于(int*),因为int是四个字节的,就是说要一下子取4个字节,就是说明一下,在取*的时候,把123456, 123457, 123458, 123459这四个内存单元里的值拿出来拼成一个int。
追问
我可不可以这样理解……就是使用指针变量定义更方便了取值地址?
追答
其实取地址是一样的,可以看到你写的两个例子,取地址都是b=&a;
使用指针,变得方便了的是两方面吧:
根据指针取值。对于指针b,取值直接就是*b。对于整数b,取值得用*((int*)b)。
对于指针的移动。如果用一个int *p指向了一个int a[123]。在移动指针的时候,p++直接指向了下一个int的地址(其实地址增加了sizeof(int)==4,毕竟一个int占用四字节内存嘛)。如果用整数int np指向int a[123],得自己np+=(sizeof(int))。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询