#include <stdio.h>
#define N 5
int main(void){
// 但是通过加减法能够求出两个指针的差值,人为改变指针的指向
int arr[N], *p1, arr1[N];
p1 = arr;
printf("p1=%d\n", p1);
printf("arr=%d\n", arr); // 6487520
printf("arr1=%d\n", arr1); // 6487488
p1 = p1 - 8; // 本质上是-8*4 = -32
printf("p1=%d\n", p1); // 6487488
int arr2[N], *p2 = arr2;
// int *num = {1,2,3,4}; 会报错
char *str = "hello!"; // 这样却不会报错
printf("p2=%x\n", p2);
printf("str=%x\n", str);
// 指针的加法(不改变指针)
int arr3[] = {1, 2, 3, 4}, *p3 = arr3;
printf("arr3的第二位是=%d\n", arr3[1]);
// 数组的指针p3默认是指向下标为0的元素
printf("*(p3+1)=%d,其地址为%x\n", *(p3+1), (p3+1));
printf("p3=%d,没有改变还是指向第0个,p3的地址为%x\n", *p3, p3);
// 指针的赋值运算(改变指针的实际指向)
p3 += 1;
printf("赋值后的p3所指向的值为%d,其地址为%x\n", *p3, p3); // 与上面的相同
// 自增自减运算
printf("自增后:%d\n", *(++p3));
printf("自减后:%d\n", *(--p3));
// 相减运算()
int *p4 = &arr3[0];
// 一个下标号是间隔一个对应类型的长度大小个单位 int是4 char是1
printf("p3=%d,地址为%d\n", *p3, p3); // arr3[1]地址为6487444
printf("p4=%d, 地址为%d\n", *p4, p4); // arr3[0]地址为648440
// 在C语言中指针加法和减法都有不一样的规则:
/*
本质上就是对下标(加数)的转换(下标转换成对应的字节来相加或输出)
加法:会将所加的数乘对应类型的单位长度再相加
减法:会将减后的结果除以对应类型长度单位返回
*/
printf("两个指针的差值为:%d\n", p3-p4);
// printf("两个指针的和值为:%d\n", p3+p4); 指针变量之间不能相加只能相减
printf("两个指针的和值为:%d\n", p3+1); // 6487448 实际上是加了4个字节
return 0;
}
遇到的C语言指针变量的运算问题
于 2022-04-09 20:02:21 首次发布
本文详细探讨了C语言中的指针操作,包括指针的加减法、赋值运算、自增自减运算以及指针的相减运算。通过实例展示了指针如何通过地址值进行算术运算,并解释了指针加法和减法的规则。同时,文章还提到了字符指针和数组指针的用法。
摘要由CSDN通过智能技术生成