湖南营销型网站建设价格,大城怎么样做网站,网页图片怎么保存为pdf文件,安装网站程序的流程一.指针与数组理解 我们都知道定义一个数组然后对其进行各种想要的操作#xff0c;但是你真的能够区分那些是对数组的操作#xff0c;那些是通过指针实现的吗#xff1f;
例如;arr[1]10;这个是纯粹对数组操作实现的吗#xff1f;
答案肯定不是#xff0c;实际上我们定义…一.指针与数组理解 我们都知道定义一个数组然后对其进行各种想要的操作但是你真的能够区分那些是对数组的操作那些是通过指针实现的吗
例如;arr[1]10;这个是纯粹对数组操作实现的吗
答案肯定不是实际上我们定义一个数组之后只能做两件事
1.确定数组的大小
2.获得一个指向该数组下标为0的元素指针
其他的操作本质上都是通过指针来实现的
为什么我要将这个呢因为如果你能够理解这个那么你就会明确的知道下面这个结论
任何一个数组下标运算都等同于一个对应的指针运算 讲到这里我们有必要重新讲解下对数组名的理解 数组名就是数组⾸元素(第⼀个元素)的地址是对的但是有两个例外 1.sizeof(数组名)sizeof中单独放数组名这⾥的数组名表⽰整个数组计算的是整个数组的⼤⼩ 单位是字节 2.数组名这⾥的数组名表⽰整个数组取出的是整个数组的地址整个数组的地址和数组⾸元素的地址是有区别的 除此之外任何地⽅使⽤数组名数组名都表⽰⾸元素的地址。 关于指针的常见错误如下 假如我们现在要定义两个指针指向对应的位置我们的代码可能如下 int* fastNULL, slowNULL; 但是你会发现在使用时fast是指针而slow却只是一个int型整数原因就在于这里定义你写错了正确的如下 int* fastNULL, *slowNULL//注意slow前面加* 指针常见错误二 如果两个指针fast 和 slow不指向同一个数组中同一个连续的空间是不能够进行相减操作的 给大家看一个案例大家可以找找有几处错误 #include stdio.h
#include string.h
int main()
{char arr1 hello;char arr2 world;char* pc malloc(strlen(arr1) strlen(arr2));//操作//……//结束return 0;
} 下面看我说的对不对 1.用到malloc一定要检查空间大小如果接下来我要进行strcat或者strcpy等操作你确定开辟的空间够用吗‘\0我放在哪呢所以第一个问题就是malloc开辟空间不够大我们应该开辟 char* pc malloc(strlen(arr1) strlen(arr2)1); 2.一个动态开辟的内存你确定一定开辟成功所以我们开辟后一定要检查 char* pc malloc(strlen(arr1) strlen(arr2)1);
if (pc NULL)
{return -1;
} 3.指针有没有问题呢你如果用完了指针你是不是要归还给系统呢 //结束
free(pc);
pc NULL; 因此正确代码如下 #include stdio.h
#include string.h
int main()
{char arr1 hello;char arr2 world;char* pc malloc(strlen(arr1) strlen(arr2)1);if (pc NULL){return -1;}//操作//……//结束free(pc);pc NULL;return 0;
} 关于指针还有一个易错点 复制指针并不会复制指针所指向的数据 下面我们来深入理解下这句话 假如现在我定义一个数组int arr[3]{1,2,3}; 再定义一个指针int p1arr; 代码如下 int arr[3]{1,2,3};
int* p1arr 如果现在我们在 int arr[3]{1,2,3};
int* p1arr;
int* p2p1; 现在是不是p1和p2都指向数组首元素了如果我再 int arr[3]{1,2,3};
int* p1arr;
int* p2p1;
p2[1]5; 此时我想问p1[1]是不是也是5没错这就表明新开辟p2指针是没有复制数据的而是直接和p1指向同一块空间明白这个有利于我们加深对指针底层理解 指针和数组可以说是C语言重点了希望大家能够对它们彻底学透。 二.边界计算和不对称边界 #include stdio.h
int main()
{int i 0;int arr[] { 1,2,3,4,5,6,7,8,9,10 };for (i; i 12; i){arr[i] 0;printf(hello world\n);}return 0;
} 看这个代码结果大家都知道就是会陷入死循环现在我为什么要提出这个简单问题呢假如你写的i12改成i10如果编译器检查不严格也可能代码陷入死循环的状态接下来我们就慢慢来告诉大家如何能够避免这种错误代码即循环次数问题。 现在假如我有100米长的围栏需要每10米立一根栏杆请问我要买几根 对于这个问题大家肯定会不假思索的答出11根 现在我们回到元素上请问16x37满足条件的整数有多少是2021还是22 我想如果你对此不熟悉的话可能需要一番思索然后才会回答22 现在我们有这样一个方法来快速的判断元素个数 如果我们将16x37转换为;16x38这个你会发现38-1622即为结果 这个对于编程有啥关系呢你可能会问 首先这种不对称关系被称为不对称边界在数组中该边界中的上界大的边界即为元素个数这样可以非常简洁的表示而不会出错。 对比下面代码 #include stdio.h
int main()
{int arr[10] { 0 };for (int i 0; i 9; i){arr[i] i;}return 0;
} #include stdio.h
int main()
{int arr[10] { 0 };for (int i 0; i 10; i){arr[i] i;}return 0;
} 将i9改成i10,这样看起来可能不美观但是可以非常有效帮助到你如果你对此还感兴趣可以去了解缓冲区知识那里运用不对称边界又是美妙的体会。 这一部分主要讲述不对称边界书写问题希望对大家有帮助。 本文章参考《C陷阱与缺陷》欢迎大家自己阅读体会里面的奇妙最后感谢大家的支持希望大家不断完善自己缺漏弥补不足