C语言经典错误总结(三)
一.指针与数组理解
?我们都知道定义一个数组然后对其进行各种想要的操作,但是你真的能够区分那些是对数组的操作,那些是通过指针实现的吗?
例如;arr[1]=10;这个是纯粹对数组操作实现的吗?
答案肯定不是,实际上我们定义一个数组之后只能做两件事:
1.确定数组的大小
2.获得一个指向该数组下标为0的元素指针
其他的操作本质上都是通过指针来实现的!
为什么我要将这个呢?因为如果你能够理解这个,那么你就会明确的知道下面这个结论:
任何一个数组下标运算都等同于一个对应的指针运算
讲到这里,我们有必要重新讲解下对数组名的理解:
int* fast=NULL, slow=NULL;
但是你会发现在使用时,fast是指针,而slow却只是一个int型整数,原因就在于这里定义你写错了,正确的如下:
int* fast=NULL, *slow=NULL//注意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* p1=arr
如果现在我们在:
int arr[3]={1,2,3};
int* p1=arr;
int* p2=p1;
现在是不是p1和p2都指向数组首元素了,如果我再:
int arr[3]={1,2,3};
int* p1=arr;
int* p2=p1;
p2[1]=5;
此时我想问p1[1]=?是不是也是5,没错,这就表明,新开辟p2指针是没有复制数据的,而是直接和p1指向同一块空间,明白这个有利于我们加深对指针底层理解!
二.边界计算和不对称边界
#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;
}
看这个代码,结果大家都知道,就是会陷入死循环,现在我为什么要提出这个简单问题呢?假如你写的i<=12改成i<=10,如果编译器检查不严格,也可能代码陷入死循环的状态,接下来我们就慢慢来告诉大家如何能够避免这种错误代码(即循环次数问题)。
现在假如我有100米长的围栏需要每10米立一根栏杆,请问我要买几根?
对于这个问题,大家肯定会不假思索的答出:11根
现在我们回到元素上,请问:16<=x<=37,满足条件的整数有多少?是20?21?还是22?
我想如果你对此不熟悉的话,可能需要一番思索,然后才会回答:22
现在我们有这样一个方法来快速的判断元素个数:
如果我们将16<=x<=37转换为;16<=x<38,这个你会发现:38-16=22,即为结果
这个对于编程有啥关系呢?你可能会问
首先这种不对称关系被称为:不对称边界,在数组中,该边界中的上界(大的边界)即为元素个数,这样可以非常简洁的表示而不会出错。
对比下面代码:
#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;
}
将i<=9改成i<10,这样看起来可能不美观,但是可以非常有效帮助到你,如果你对此还感兴趣,可以去了解缓冲区知识,那里运用不对称边界又是美妙的体会。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!