设计企业网站流程,搜索引擎关键词seo优化公司,温州关键词优化工具,塘厦 网站建设 百度推广前言 指针变量的解引用和加法运算是非常高频的考点#xff0c;也是难点#xff0c;因为对初学者的不友好#xff0c;这就导致了各大考试都很喜欢在这里出题#xff0c;通常会伴随着强制类型转换、二维数组、数组指针等一起考查大家对指针的理解。但是不要怕#xff0c;也许…前言 指针变量的解引用和加法运算是非常高频的考点也是难点因为对初学者的不友好这就导致了各大考试都很喜欢在这里出题通常会伴随着强制类型转换、二维数组、数组指针等一起考查大家对指针的理解。但是不要怕也许看完这篇文章你有了新的认识和理解写的不透彻的地方也希望大家多多指正 理解指针变量的解引用 我们分下面两步理解 解引用拿出来的是什么解引用根据什么拿出来的
1. 拿出来的是什么 首先解引用拿出来的就是指针指向的内容比如指针p指向的是这个地址*p就是拿出来地址里面的内容 2. 根据什么拿出来的 指针的类型决定了对指针解引用的时候有多大的权限能拿出几个字节。 比如 char* 的指针解引用就只能访问1字节 #include stdio.h
int main()
{int a 40000;int *p a;printf(%d\n, *(char*)p);return 0;
} 本应该是40000的值咋变成64了这其实就跟解引用的指针类型有关了但是这里还涉及了一个知识点是大小端上面是小端的结果小端就是低位在低地址高位在高地址大端反之所以会有不同的结果因为解引用是从低地址开始的大端结果就应该是0 int* 的指针的解引用就能访问4字节 #include stdio.h
int main()
{int a 40000;int *p a;printf(%d\n, *p);return 0;
} 所以这里就是直接解引用了4个字节只要是涉及多个字节了取出来的要按照低位还是低位来算切记不能以为先取出来的就是高位 理解指针变量的加法 我们来分这两步理解 指针变量的加法加的是什么指针变量的加法是根据什么来加的
1. 加的是什么 我们首先来分析指针变量是什么指针变量是一个地址那指针变量的加法实际上就是对这个指针变量代表的地址做加法也就是向后移动指针变量指向的位置让指向的地址更高。 2. 根据什么来加 指针变量的加法是根据指针变量的数据类型实现的 指针 n 指针 n*指针类型中的除*的类型所占字节 char*就是n int*就是4n 比如char*类型
char c 0;
char *pc c;
printf(pc %p\n, pc);
printf(pc 1 %p\n, pc 1); 我们可以看到pc1的值是向后移动了1个字节 比如int*类型
int i 0;
int *pi i;
printf( pi %p\n, pi);
printf(pi1 %p\n, pi 1); 此时int类型的pi1的值是向后移动了4个字节 比如double*类型
double d 0;
double *pd d;
printf( pd %p\n, pd);
printf(pd1 %p\n, pd 1); 此时double类型的pd1的值是向后移动了8个字节 例题
1. 普通的加法
#include stdio.h
int main()
{int arr[5] {1, 2, 3, 4, 5};int *p arr;printf(%d\n, *(p 1));printf(%d\n, p[1]);return 0;
}
答案及解析2 2 首先p指向的是arrarr是数组名代表的是首元素的地址所以p指向的就是首元素的地址 p数据类型为int*p1就是向后移动4*1个字节到达arr[1]的地址解引用是取4个字节取到的就是arr[1] p既然是首元素地址那p和arr就没区别所以p[1] 等价于 arr[1]为2 2. 包含强制类型转换的加法
#include stdio.h
int main()
{int arr[5] {1, 2, 3, 4, 5};int *p arr;printf(%d\n, *((char*)p 1));printf(%d\n, *((short*)p 2));return 0;
}
答案及解析0 2 这时候我们必须要用二进制来表示数字因为这里涉及到了强制类型转换此时加法和解引用都会受到影响。所以这里的第一个输出语句是先强制类型转换成char*类型然后一直是对char*类型的指针进行加法和解引用这里我一直按小端讲解 而我们的第二个输出语句则是强制转换short*加法和解引用都是2字节 3. 包含二维数组和数组指针的加法 #include stdio.h
int main()
{int arr[2][2] {{1, 2}, {3, 4}};int (*p)[2] arr;printf(%d\n, **(p 1));return 0;
} 在这里首先要知道二维数组名代表的是什么我们必须清楚一个逻辑 二维数组是一维数组的数组也就是说可以把二维数组看成存放一维数组的数组 这样说肯定很抽象我们看图 二维数组名代表的是第一行的地址也就是代表整个第一行相当于arr[0]那二维数组名就是一个数组指针了因为数组指针也是表示的一个数组的地址所以我们可以定义一个数组指针p arr那p 1就要慎重了p的数据类型是int (*)[2]所以p1就是移动整个数组的大小所以p1 就指向的是arr[1]这个数组p 1 arr[1]所以解引用一次就是取到了整个数组arr[1]但是*(p 1) arr[1]arr[1]是这个二维数组的行相当于该行这个一维数组的数组名既然是一维数组的数组名就是首元素地址那就是int*类型再解引用就是解引用4字节拿到的就是3.