#include
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int *p;
p=arr;
*p=10;
p++;
*p=20;
printf("%d\n",arr[0],arr[1]);
return 0;
}
问:输出结果为什么???指针p++;是一下那种情况
1、加一个字符数组的长度
2、加一个字节的长度
3、加一个单元格的长度
分析:
1、程序员需要指针p++所产生的作用:程序员需要通过指针p++来改变数组中数组的值,而不是通过指针p++创建一个新的数组并添加在原数组后,
2、边界问题:当数组大小规定,如过使用指针p++来加一个字符数组的长度,会产生越界问题,使数组队列溢出而使程序崩溃
因此,忽略问题1,验证问题2、问题3,查看指针如何使用,会使指针指向数组中的格子,而改变数组的值
验证:
问题1、
#include
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //定义一个数组arr,规定大小为十个格子
int *p = arr; //定义一个指针p指向arr数组(数组arr的首地址)
*p = 10; //将10赋值给指针p,即将数组arr的首地址(第一个格子)的值从1更改为10
p = (int *)((int)p+1); //该操作为指针p向后移一个字节
*p = 20; //将指针移动后的地址所对应的值更改为20
printf("%d,%08x\n",arr[0],arr[1]); //输出数组arr的第一个值和第二个值
return 0;
} //输出结果为5130、00000000
分析:为改变数组arr[0]、arr[1]中的值,定义指针p,使指针p向后一个字节发现,数组arr的第一个值和第二个值并未按预计想法赋值成为10、20,因此得出指针p++仅使指针向后移动一个格子(int型指针大小为四个字节),即四个字节,
#include
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = arr;
*p = 10;
p++;
*p = 20;
printf("%d,%08d\n",arr[0],arr[1]);
return 0;
} //程序输出结果为10、20
结论:
指针加法,加一个单元格大小,
指针减法,需要调整,调整的权重为sizeof(指针去掉一个*)
int main()
{
int *p1 = (int *)2000;
printf("%d\n",p1+4);
int arr[10] = {1,2,3};
int *p = arr; //int
*p = 10;
p++; //加一个int单元格,4字节
*p = 20;
double brr[5] = {12.3,34.5,56.7};
double *dp = brr; //double
dp++; //加一个单元格,8字节
*dp = 100;
char crr[5] = "abc";
char *cp = crr; //char
cp++; //加一个单元格,1字节
*cp = 'x';
return 0;
}
例题:
int main()
{
int *p = (int *)2000;
printf("%d\n",p+4); //int型,四个字节大小,2000+4*4,输出结果为:2016
printf("%d\n",(short *)p+4); //short型,二个字节大小,2000+4*2,输出结果为:2008
printf("%d\n",(double *)p+4); //double型,八个字节大小,2000+4*8,输出结果为:2032
printf("%d\n",(float **)p+4); //float**,指针型,四个字节大小,2000+4*4,输出结果为:2016
printf("%d\n",(unsigned short *)p+4); //无符号short 型,两个字节大小,2000+4*2,输出结果为:2008
printf("%d\n",(long *)p+4); //long型,四个字节大小,2000+4*4,输出结果为:2016
printf("%d\n",(char *)p+4); //char型,一个字节大小,2000+4*1,输出结果为:2004
printf("%d\n",(unsigned long long)p+4); //无符号长长整型,常量,一个字节大小,2000+4*1,输出结果为:2004
return 0;
}