C系列总结1 & 浅谈数组-存储细节及其与指针的辨析
来源:互联网 发布:软件项目招标评分标准 编辑:程序博客网 时间:2024/06/06 02:50
前言:
不积跬步,无以至千里
数组是C中非常简单的概念,但个中细节还是值得总结一二,如下
参考书目
- 《C语言深度剖析》
- 《C++primer》
以及
- Write by 张鹏霄, zpx736312737@126.com
概要:
- 定义
- 数组的声明a[N],其中a是数组的名字,N是数组的纬度。
- 纬度说明了数组中元素的个数,对于大小固定的数组,在编译的时候必须是已知的,即:N必须是常量。
- 相比较C++中的vector,数组损失了一些灵活性,但在某些应用中性能较好。
- 难点
- 数组与指针的辨析
- 数组在内存中的存储细节
数组初始化
显式:
int arr[] = {1,2,3};int arr[3] = 0;const unsigned sz = 3;int arr[sz] = {1,2,3}
误用案例:
char a[6] = "hahaha";//没有空间存放空字符
数组的存储与访问
数组在内存的存储被分为两部分:数组名与数组元素:
- 数组名作为一种特殊变量(引用类型),被存在栈中;
- 数组元素作为数组的实际变量存在堆中;
- 不同于
int i = 1;
中i是变量名,1是变量的值,数组的元素没有名字(a[x]不是变量名); - 数据的访问通过数组名解引用得到数组首元素的地址,其后元素可用指针或下标的形式访问。
数组与指针在使用中常被混淆
《C语言深度剖析》中明确指出:指针与数组是两个完全不同的数据类型
- 指针在32位系统下永远只占4byte,其值为某一内存的地址;
- 数组大小由数组元素类型及个数决定,可以存除函数外的任意类型数据。
- 指针与数组常常被混淆的一个原因是:两者都可以使用指针、下标的形式去访问数据
char *p = "abcdef";
此时*(p+4)与p[4]都可以访问到字符 ‘e’;char p[] = "abcdef";
此时*(p+4)与p[4]都可以访问到字符 ‘e’。
关于数组名在一些少见的情况下有几点需要强调
- sizeof(a)中a被作为数组名(引用类型变量)处理(未被解引用),其它情况会被解析为首元素地址
int a[] = {1, 2, 3, 4};printf("%d\n",sizeof(a));//16 对数组名(引用类型数据)其大小受元素类型与个数影响printf("%d\n",sizeof(*a));//4 *a为首元素地址printf("%d\n",sizeof(a[1]));//4 第二个元素的地址printf("%d\n",sizeof(&a));//4 对数组名(引用类型数据)解引用后结果为首元素的地址
多维数组
- 根据《C++primer》中定义:多维数组其实是数组的数组
- 对二维数组来说:一个维度表示数组本身大小,一个维度表示其元素(也是数组)的大小。
初始化
int a1[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};int a2[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0};//后两个元素为0int a3[3][4] = {{1, 2}, {4, 5}, {6, 7,}};//后两列元素为0printf("%d\n",a3[0][0]);//1
多维数组的存储与访问
对于
int a1[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
- a[0][3]向后偏移一个元素为a[1][0],即多维数组在内存中“线性存储”。
- 因此,多维数组的访问(指针与下标)可以参考一维数组。
数组的拷贝、其它易理解的知识点不在本文讨论范围之内。
阅读全文
1 1
- C系列总结1 & 浅谈数组-存储细节及其与指针的辨析
- 【C语言】数组与指针的辨析
- C语言中数组与指针辨析
- C语言中数组与指针辨析
- C 指向数组的指针,与存储指针的数组
- C++ 数组指针与普通指针的辨析
- 辨析指针数组与数组指针
- 数组指针与指针数组及指针与数组的辨析
- 数组指针和指针数组的辨析
- c语言字符串与数组还有指针的总结(1)
- 浅谈C语言 extern 指针与数组
- 浅谈C语言 extern 指针与数组
- C语言--二维数组与指针浅谈
- 浅谈-- 二维数组及其指针
- 浅谈数组与指针
- c指针浅谈第二篇(指针与数组的关系)
- 数组名是否是指针的辨析
- 数组名和指针的关系辨析
- 泛型
- centos7 设置禅道开机自启动
- javase-1
- 算法概论8-20 占优集问题
- C++学习笔记十之创建类型别名(define和typedef)
- C系列总结1 & 浅谈数组-存储细节及其与指针的辨析
- javase-2
- shell script : stop program
- [30]XML
- javase-4-io流
- javase-5-反射
- python基础练习(三)
- spring-1-简单配置案例
- Spring中jdbcTemplate操作mysql出现中文乱码???