1.数组的一般知识
int a[5];
char b[] = “hello”;
数组大小必须在编译期就作为一个常数确定下来。
但C99中引入了变长数组,允许数组的维度是表达式 ,但在数组分配内存时,其表达式的值可以被求出。
数组下标运算实际上都是通过指针进行的,也就是说a[4]与*(a+4)是等价的,甚至你会发现和4[a]也是一样的。数组名一般代表了指向该数组下标为0的元素的指针,并且printf("%s\n",hello)与printf("%s\n",&hello[0])等效。
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的元素的指针,但有例外:sizeof(数组名)返回整个数组的大小,而非指针大小;&数组名返回一个指向数组的指针,而不是指向该数组中下标为0的元素的指针的指针。
数组名作为参数时,数组名会被转换成指向该数组下标为0的元素的指针。指针操作可能比下标操作效率高,但可维护性却不一定有下标操作好。数组和指针不相等。
学习笔记——数组
最新推荐文章于 2024-04-28 13:03:04 发布