#include<stdio.h>
main(){
int b=90;
int* a;
a=&b;
//pointer arith metic
printf("Address a is %d\n",a);
printf("size of integer is %d bytes\n",sizeof(int));
printf("Address a is %d\n",*a);
printf("Address a+1 is %d\n",a+1);
printf("value of a+1 is %d\n",*(a+1));
char *ip;
ip=(char*)&b;
printf("Address ip is %d\n",ip);
}
该计划的输出:
Address a is 1495857868
size of integer is 4 bytes
Address a is 90
Address a+1 is 1495857872
value of a+1 is 1495857868
Address ip is 1495857868
Address ip is 90
1.在a + 1位置和
的地址之间总是有4个字节的间隙2. *(a + 1)处的值的输出和当时的变量b的地址 指针转换为char变得相等 3.尽管指针值转换为char,但它显示变量的完整值
ip=(char*)&b;
printf("Address ip is %d\n",*ip);
输出:地址ip为90
答案 0 :(得分:1)
此:
a + 1
当a
类型为int *
时,将打印地址增加一个int
的大小。这被称为指针算术,并且是指向C的最核心功能之一。
答案 1 :(得分:1)
1.在a + 1位置的地址之间总是有4个字节的间隙
Gap字节由指针类型决定:char指针 - &gt; gap bytes是1个字节,int指针 - &gt;间隙字节是4个字节...
在这种情况下:变量a是int指针 - &gt;间隙字节是4个字节
==&gt;地址偏移量(a + 1)和(a)为4字节(1495857872 - 1495857868 = 4)
- *(a + 1)处的值的输出和指针转换为char时的变量b的地址变得相等
醇>
地址(a + 1)处的值无法预测,它基于您的系统。
我在我的电脑上跑,结果是:
地址b是:2665524
a + 1的值是:2665720
如果您稍微更改一下代码,请先添加 (a + 1)= 5; : < / em> //指针arith metic *
然后运行 - &gt;结果成为:
Address b is: 2665524
value of a+1 is: 5
3.尽管指针值转换为char,但它显示变量的完整值
它显示变量的完整值,因为b的值是90,这个值只需要1个字节存储在内存中,所以当它转换为char(内存中的1个字节)时,你看到转换为char后的值等于int value。
如果你asign b&gt; 255,例如:int b = 290;
然后运行 - &gt;结果成为:
Value a is: 290
value ip is: 34
答案 2 :(得分:0)
您可以更改:
printf("Address a is %d\n",a);
到
printf("Address a is %p\n",a); //%p is specifically designed for pointers.
直到
printf("Address a+1 is %d\n",a+1);
你的代码应该没问题。但下一个陈述是有问题的
printf("value of a+1 is %d\n",*(a+1));
由于a
是指针a+1
,因此系统中a
占用的字节数int
将提前a
。然后,通过执行*(a + 1),您尝试访问未分配给的内存位置。(记住a=&b;
仅用于存储{{1}时的一个整数的地址})。
当您尝试取消引用您无权使用的内存位置时,根据C标准,行为未定义。
3.尽管指针值转换为char,但它显示变量的完整值
ip=(char*)&b;
语句虽然指针值转换为char 是错误的。只是你将地址&b
中的内容视为字符。然后你有:
printf("Address ip is %d\n",*ip);
// Remember you're printing the value not address. So change the print message
请记住,任何数据都存储为位zeroes
或ones
,它是您选择的格式说明符,用于确定其显示方式。在这里,您将&b
中的内容打印为%d
中printf
中提到的整数,因此结果为90。幸运的是,数字90
足够小,可以包含在一个字节中。
假设您将printf更改为:
printf("Value pointed to by ip is %c\n",*ip); // %d to %c
你应该有
Value pointed to by ip is Z
此处90
被解释为ASCII码,对应于字母Z
。