本期笔记内容:
C语言 :27.指针运算
27.指针运算
一个数据的 内存信息 有:①首地址 通过指针的值来保存目标数据对象的首地址
②存储空间大小 通过类型本身来标记数据的空间大小
一、指针类型与整型加减
尝试用指针变量从地址100开始加减,看看能否成功
#include<stdio.h>
int main()
{
//在此定义不同类型的指针
char* pc;
short* ps;
int* pn;
long* pl;
long long* pll;
float* pf;
double* pd;
pc = 100;
ps = 100;
pn = 100;
pl = 100;
pll = 100;
pf = 100;
pd = 100;
pc = pc + 1;
ps = ps + 1;
pn = pn + 1;
pl = pl + 1;
pll = pll + 1;
pf = pf + 1;
pd = pd + 1;
printf("pc=%u\n",pc);
printf("ps=%u\n", ps);
printf("pn=%u\n", pn);
printf("pl=%u\n", pl);
printf("pll=%u\n", pll);
printf("pf=%u\n", pf);
printf("pd=%u\n", pd);
return 0;
}
编译后可发现:
编译不能正常通过
编译器提示不能将int类型转换为指针类型
指针储存的信息有首地址和空间大小,而数值只能当作首地址,无法表示空间大小,因此数值不能赋值给指针
因此,若要将数值作为地址导入指针,我们就需要将数值强制转换为指针对应的类型
#include<stdio.h>
int main()
{
//定义不同指针类型
char* pc;
short* ps;
int* pn;
long* pl;
long long* pll;
float* pf;
double* pd;
//括号强制转换100为对应的指针类型(括号里面的为转换后的类型)
//地址为:100
pc = (char*)100;
ps = (short*)100;
pn = (int*)100;
pl = (long*)100;
pll = (long long*)100;
pf = (float*)100;
pd = (double *)100;
//在指针的地址上加1,观察其结果有什么不一样
pc = pc + 1;
ps = ps + 1;
pn = pn + 1;
pl = pl + 1;
pll = pll + 1;
pf = pf + 1;
pd = pd + 1;
//将指针的地址打印出来
printf("pc=%u\n",pc);
printf("ps=%u\n", ps);
printf("pn=%u\n", pn);
printf("pl=%u\n", pl);
printf("pll=%u\n", pll);
printf("pf=%u\n", pf);
printf("pd=%u\n", pd);
return 0;
}
编译可以正常通过了,打印出了:
pc = 101
ps = 102
pn = 104
pl = 104
pll = 108
pf = 104
pd = 108
观察结果,所有的指针内一开始保存的首地址是100,加1之后变成了不同的值,他们与100的差值是对应的目标数据对象的空间大小
从这个例子可以看出,指针类型加1后,将首地址向后移动了 sizeof(目标数据对象)个字节
将指针类型加n和减n都是这样移动的,移动n个目标数据对象字节
得出结论:1.sizeof(目标数据对象)被称作 步长
2.指针类型加n后,其首地址向后移动n*步长个字节
3.指针类型减n后,其首地址向前移动n*步长个字节
二、应用指针类型与整型加减
int* p; //定义一个指针p
*(p - 1) = 123; //意思是将指针p-1取123的值
p - 1; //意思是在指针p的地址上向前移动1个步长
加法亦是如此
三、同类型指针减法运算
指针类型相减后,结果为两个首地址的差值除以步长