国家级示范建设网站,个人网站模板打包下载,网站运营需要什么行业技术,10_10_网站建站前言在C语言中#xff0c;数组和指针似乎总是“暧昧不清”#xff0c;有时候很容易把它们混淆。本文就来理一理数组和指针之间到底有哪些异同。数组回顾在分析之前#xff0c;我们不妨回顾一下数组的知识。数组是可以存储一个固定大小的相同类型元素的顺序集合。为了便于我们… 前言在C语言中数组和指针似乎总是“暧昧不清”有时候很容易把它们混淆。本文就来理一理数组和指针之间到底有哪些异同。数组回顾在分析之前我们不妨回顾一下数组的知识。数组是可以存储一个固定大小的相同类型元素的顺序集合。为了便于我们说明假设有以下数组声明int a[5];
char b[] hello;数组大小必须在编译期就作为一个常数确定下来。但C99中引入了变长数组允许数组的维度是表达式 但在数组分配内存时其表达式的值可以被求出。数组下标运算实际上都是通过指针进行的也就是说a[4]与*(a 4)是等价的甚至你会发现和4[a]也是一样的。数组名一般代表了指向该数组下标为0的元素的指针并且printf(%s\n,hello)与printf(%s\n,hello[0])等效。数组和指针不相等考虑下面的声明int c[4]//假设int占4字节
int *d;对于上面的声明编译器会给c预留内存空间4*4字节并且数组名代表着指向数组第一个元素的指针。但对于d却只为指针本身保留了内存空间。所以此时有下面的操作c[3]; //合法
*(c 3); //合法
*d; //不合法d指向了内存中不确定位置
c //不合法一维数组名是指针常量常量不能被修改掉
d //可通过编译另外下面的两种情况也是不一样的char c[] hello;
char *d hello;前者对字符数组a进行了初始化后者将d指向了字符串常量。字符串常量存储在只读区因此有下面的操作 c[0] H; //合法可修改数组内容*d H; //不合法字符串常量内容不可更改d[0] H //不合法数组名的含义绝大多数情况数组名都代表着指向该数组中下标为0的元素的指针但是有例外int e[4];//假设int为4字节
sizeof(e);上面的sizeof(e)的值并非4或8指针占用空间而是4*4 16。也就是说当数组名被用作运算符sizeof的参数时它的计算结果是整个数组的大小而非第一个元素的指针大小。再来看下面这种情况int temp[5];
char *p temp;
char *q temp;在这里p和q的值是一样的含义却不一样前者是指向数组的指针而后者是指向该数组中下标为0的元素的指针。因此p 1指向了temp的末尾而q 1指向了temp的第2个元素。数组长度计算如何计算数组长度考虑下面的代码int f[] {1,2,3,4,5,6};
int *g f;
size_t len_f sizeof(f)/sizeof(int)//正确计算方法
size_t len_g sizeof(g)/sizeof(int)上面的len_f和len_g的值相等吗显然并不相等。事实上只有len_f得到了数组f的长度而len_g的值并没有任何实际意义。不能作为参数的数组所谓的数组不能作为参数并不是指声明的数组不能作为参数传递而是指当数组名作为参数时数组名会被转换为指向该数组下标为0的元素的指针。而下面的两种声明其实也是等效的size_t arrayLen(const int *arr);
size_t arrayLen(const int arr[]);我们来看一个例子说明数组作为参数的情况#include
int arraySum(const int arr[])
{unsigned int loop 0;/*循环前计算好长度提高性能*/unsigned int len sizeof(arr)/sizeof(int);int sum 0;if(NULL arr){return 0;}for(loop 0; loop len; loop ){sum arr[loop];}return sum;
}
int main(void)
{int a[] {1,2,3,4,5,6};int sum arraySum(a);printf(arr sum is %d,sum);return 0;
}我们运行上面的程序发现最终结果并不是我们预期的21而是3。问题在于a作为参数传入到arraySum中时它是作为指针的那么在函数内部计算sizeof(arr)自然只是得到了指针占用的内存大小。对于64位程序这个大小是8那么len的值为2最终只计算了两个元素的和。思考该如何修改上面的程序才能得到正确的结果总结我们来总结一下前面的核心内容数组下标运算实际上都是通过指针进行的。数组名代表着指向该数组中下标为0的元素的指针但有例外sizeof(数组名)返回整个数组的大小而非指针大小数组名返回一个指向数组的指针而不是指向该数组中下标为0的元素的指针的指针。数组名作为参数时数组名会被转换成指向该数组下标为0的元素的指针。指针操作可能比下标操作效率高但可维护性却不一定有下标操作好。数组和指针不相等。声明本文于网络整理版权归原作者所有如来源信息有误或侵犯权益请联系我们删除或授权事宜。