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