指针的偏移
int main()
{
int num = 100;
int *pnum = #
printf("%p\n", pnum); 00E2FBB4
printf("%d\n", *pnum); 取值时,根据pnum里存储的值来读取当前指定位置;找到指定位置后,根据指针类型,去读取对应数据的长度。做存储时,先找到 pnum的地址,取出pnum中的值,解引用,根据当前记录的长度,往里面写入值。
pnum++; 增加的是指针的长度
printf("%p\n", pnum); 00E2FBB8 int 型长度增加4
char *pchar = #
printf("%p\n", pchar); 00E2FBB4 指向num的地址
printf("%d\n", *pchar);
printf("%c\n", *pchar);
pchar++;printf("%p\n", pchar); 00E2FBB5 char型长度增加1
double *pdouble = #
printf("%p\n", pnum);
00E2FBB4printf("%d\n", *pdouble);
printf("%c\n", *pdouble);
printf("%lf\n", *pdouble); 数据会出错,不能以%lf来解析
pdouble++;
printf("%p\n", pdouble); 00E2FBBC double型长度增加8
return 0 ;}
注: 使用指针时,不能使用与数据类型不同的指针。以上例子只用于了访问指针内存储的值。如果进行修改,则会发生错误。使用char型指向int型数据,char型的指针大小比int型的小,会修改实际数据的值。而如果使用double型指向int 型的数据,double型指针大小比int型的大,会改写实际数据之外的值。
数组也是指针的一种,数组将类型相同的数据集中在一起,数组名指向集合的首地址,通过指针偏移的方式访问数组。操作数组使用的下标,其实就是使用指针名代表的地址加上对应的下标,通过指针偏移的方式指向待访问的数据地址。来读取和改写值。
数组存储字符串:
字符串是由\0表示结尾
char string[9]="123456789";
printf("%s",string); 在字符串后会打印出一些乱码,程序运行到需要取字符串的时候,会从当前指定的指针地址后开始读取,一直遇到"\0"才会停止读取,没有会导致乱码。
char *pstring = "123456789"; 字符串辨别长度根据"\0"来判断是否是结尾;
char string[10]="123456789"; 将空间分配在栈中,可读可写
char *pstring = "123456789"; 编译器将字符串放在常量区
*(pstring+1='A' ; 会发生错误