weex做网站,wordpress怎样搭建,wordpress更换域名首页无法访问,网站策划方案如何做目录
前言
改变固有数组的平面思维
注意#xff1a;
数组操作与指针等价
指针数组
数组指针
笔试加深理解#xff1a; 解析#xff1a; 前言 《C Traps and Pitfalls》(C语言缺陷与陷阱)中有一句著名的见解#xff1a; “在C语言中#xff0c;指针与数组这两个概念…目录
前言
改变固有数组的平面思维
注意
数组操作与指针等价
指针数组
数组指针
笔试加深理解 解析 前言 《C Traps and Pitfalls》(C语言缺陷与陷阱)中有一句著名的见解 “在C语言中指针与数组这两个概念之间的联系时如此密不可分以至于如果不能理解一个概念就无法彻底理解另一个概念。” 改变固有数组的平面思维 在本质上C语言只有一维数组只是数组的元素可以是任意类型的对象当然也可以是一个数组于是这样就产生了高维数组 对于
int arr[6][4];在上图中arr是一个一维数组内部含有六个元素每个元素arr[0],arr[1]......arr[5]的类型是一个数组类型假设这个数组arr[0],arr[1]......arr[5]中的元素 arr[i][j] 是整形那么这个数组arr[0],arr[1]......arr[5]的类型是 int (*)[4] ; 换句话说 这个语句声明的arr是一个数组该数组拥有6个数组类型的数据其中每个元素都是一个拥有4个整形元素的数组。而不是一个拥有4个数组类型的数组其中每一个元素是一个拥有6个整形元素的数组 其实对于数组arr它就是一个主串主数组上伸出了许多子串子数组类似于河流的主流外有许多支流 它可以是随意分布的我们平时为了清晰我们一般画图将二维数组画成二维棋盘形状。 我们实际上可以将数组画成任意分布只要满足C标准 二维平面不好演示请自行脑补拖把头每根布的分布 其实我们也可以从数组arr的创建格式上看出端倪 int arr[6][4];//请重新审视这段代码以便于加深对他的理解 这段代码可以翻译为 创建一个名字为arr的数组内部元素为6个 int (*)[4] 类型的数组。其实就是从前到后对这段代码进行翻译。 注意 这样一边翻译一边理解的思想是十分重要的如果不采取这样的思想那么对于数组指针指针数组函数指针函数指针数组 的理解和区分 将十分困难 数组操作与指针等价 对于一个数组我们只能做两件事 确定该数组的大小 以及 获得指向该数组下标为0的元素的指针。 对于其他有关数组的操作其实本质上就是指针的操作。也就是说任何一个数组下标的运算都等同于一个对应指针的运算因此指针操作与数组操作是可以相互转化的。 数组可以看作是一组相邻的内存单元的集合而指针则是一个指向内存地址的变量。由于数组实际上就是一段连续的内存空间因此可以使用指针来访问数组中的元素。 具体来说可以将数组名看作是一个指向数组第一个元素的指针即数组名本身就是一个地址。因此使用指针变量来对数组进行操作就非常方便如以下示例
int arr[5] {1, 2, 3, 4, 5};
int *p arr; // 将数组名赋值给指针
for (int i 0; i 5; i) {printf(%d , *(p i)); // 使用指针来访问元素指针数组 C语言中的指针数组是指一个数组其中的每一个元素都是一个指针。这样的数组可以用于存储多个指针以便对它们进行操作。 例如一个指针数组可以用于存储不同类型的指针如整型指针、字符型指针、结构体指针等
int *ptrArray[10]; // 整型指针数组包含10个元素
char *strArray[5]; // 字符型指针数组包含5个元素
struct person *personArray[100]; // 结构体指针数组包含100个元素可以通过下标来访问数组中的元素并对其进行操作
int a 10, b 20, c 30;
int* ptrArray[3] { a, b, c };for (int i 0; i 3; i) {printf(%d , *ptrArray[i]); // 指针数组中的每个元素都是整型指针需要使用 * 解引用
}// 输出结果为10 20 30数组指针 在C语言中 整形指针变量 int * pint; 存放的是整形变量的地址能够指向整形数据的指针。 浮点型指针变量 float * pf; 存放浮点型变量的地址能够指向浮点型数据的指针。 那数组指针变量应该是存放的应该是数组的地址能够指向数组的指针变量。 数组指针本质上是一个指针变量但它可以指向一个数组从而允许对数组的操作。 由于结合性的问题数组指针的写法与指针数组的大不相同
int *p1[10];
int (*p2)[10];
解释 1.是前文介绍的指针数组 2.p先和*结合说明p是⼀个指针变量变量然后指着指向的是⼀个⼤⼩为10个整型的数组。所以 p是⼀个指针指向⼀个数组 这里要注意[ ]的优先级要高于*号的所以必须加上来保证p先和*结合。
初始化
int arr[10] {0};
int(*p)[10] arr;
应用数组的地址初始化数组指针。并且数组指针p与arr的类型是相同的。
这照应了本文的第一部分数组指针是高维数组的基础。 现在有了一定的知识基础不妨做一些题目检测一下
笔试加深理解
题目1
#include stdio.h
int main()
{
int aa[2][5] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//#int *ptr1 (int *)(aa 1);//*int *ptr2 (int *)(*(aa 1));//printf( %d,%d, *(ptr1 - 1), *(ptr2 - 1));//
return 0;
} 解析 #行 对数组aa初始化aa两行五列 *行 创建整型指针ptr1 取出aa的地址 1 后强制类型转化为int*,放入ptr1 对数组的地址运算实际上1表示跳过整个数组。此时ptr1指向数组紧跟着的一个元素的地址。 表达式的类型是int (*)[5],强制类型转化后是int*刚好可以存入ptr1中。 行 aa1 中的aa表示数组首元素的地址是 int aa[0] 的地址 这一点很重要——这第三次照应了数组aa是一维数组每一个元素也是一个数组那么aa中的每一个元素都是数组类型而不是aa中的元素类型是int型。 aa 1 表示指向第二行存放的是第二行的地址表示第二行的首元素地址。 行打印*ptr1-1即数组最后一个元素打印*ptr2-1即第二行前的一个元素。
结果 完~
未经作者同意禁止转载