1. 指针类型的基本信息
- 指针用于保存一个数据对象在内存中的位置。
- 每个数据对象有两个关键信息:首地址和存储空间大小。
- 指针类型存储数据对象的首地址,并通过类型本身标记其空间大小。
- 内存地址是从0开始逐步增加的整数。
2. 指针与整型加减运算
- 指针的值是内存地址,可以与整型进行加减运算。
- 在指针与整型加减运算中,结果会根据目标数据对象的大小(步长)来移动地址。
例如:
#include <stdio.h>
int main() {
char* pc;
short* ps;
int* pn;
long* pl;
long long *pll;
float* pf;
double* pd;
// 现将整型转换为对应的指针类型再赋值
pc = (char *)100;
ps = (short *)100;
pn = (int *)100;
pl = (long *)100;
pll = (long long *)100;
pf = (float *)100;
pd = (double *)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;
}
- 编译会提示不能直接将整型赋值给指针,需要先进行类型转换。
- 加1后,指针地址移动量与数据类型大小相关,比如`char`类型加1移动1字节,`int`类型加1移动4字节。
3. 指针与整型加减应用
- 通过指针操作可以访问和修改变量的值。例如:
#include <stdio.h>
int main() {
int n1, n2, n3, n4;
int *p = &n1;
printf("&n1=%d, &n2=%d, &n3=%d, &n4=%d\n\n", &n1, &n2, &n3, &n4);
printf("p = %d\n", p);
printf("p - 1 = %d\n", p - 1);
printf("p - 2 = %d\n", p - 2);
printf("p - 3 = %d\n", p - 3);
putchar('\n');
*p = 111;
*(p - 1) = 222;
*(p - 2) = 333;
*(p - 3) = 444;
printf("n1=%d, n2=%d, n3=%d, n4=%d\n", n1, n2, n3, n4);
return 0;
}
- `p`指向`n1`,`p-1`指向`n2`,依此类推。操作结果为`n1`至`n4`分别被赋值111至444。
4. 同类型指针减法运算
- 指针减法运算依然受步长影响,不同元素间的距离按步长大小计算。
- 数组保证内存连续性,代码示例如下:
#include <stdio.h>
int main() {
int arr[10];
printf("&arr[0] = %d\n", &arr[0]);
printf("&arr[5] = %d\n", &arr[5]);
printf("&arr[5] - &arr[0] = %d\n", &arr[5] - &arr[0]);
return 0;
}
```
- 示例中数组`arr[5]`与`arr[0]`相差5个元素,符合步长规律。
5. 无意义的指针运算
- 指针与整型进行乘除运算,同类型指针相加或相乘除,这些运算没有实际意义,在C语言中无法通过编译。
6.总结:
- 指针与整型加减运算的结果与目标数据对象的大小(步长)相关。
- 数组保证内存中各元素连续分布,可以使用指针访问和操作。
- 实际编程中,应注意局部变量内存不连续性,避免依赖指针加减直接访问不同变量。
通过上述指导,你可以对指针运算有一个更清晰的理解,进而在实际编程中灵活应用。