C语言基础三(数组)

本文介绍了C语言中的数组,包括定义、使用、字符数组、初始化和多维数组。数组是一段连续的数据空间,定义时需指定常量大小。数组元素通过下标访问,注意避免越界。在函数调用中,数组名传递实际是传递首地址。字符数组存储字符串,以''结尾。多维数组在内存中按一维方式存放。
摘要由CSDN通过智能技术生成

数组

数组表示在内存中定义的一段连续的数据类型的空间。
int arr[10]; 表示定义了内存中连续的十个int类型的变量
这个数组的类型是int [10],数组名是arr。c语言里变量定义都是由类型+类型名组成。
sizeof(int [10]) == sizeof(arr); sizeof()运算符
sizeof(变量名)得出的是该变量所占空间, sizeof(类型)表示该类型所占空间。

数组定义

定义数组时数组大小必须确定,也就是说中括号里面必须是常量表达式:array[常量表达式]。
定义数组时赋值叫做数组初始化。只有初始化的时候可以集体赋值,定义完成后只能一个一个赋值。
数组中个元素都有自己的下标,从0开始。
int arr[5] = {1, 2, 3,}; //部分初始化,前三个元素被赋值为1,2,3,其余的全赋值为0
int arr[5] = {0}; //部分初始化,全都赋值为0
int arr[5] = {[2]=100}; //下标为2的元素赋值为100,即第三个元素。
int arr[5] = {}; //这种写法在Visual C++ 6.0中是编译不通过的,但是在linux下的gcc编译通过,全部赋初值为0

数组使用

数组元素使用时只能单个使用。

int arr[5] = {1, 3, 4, 5, 6,};
//数组遍历
for (i=0; i<10; i++)
    printf("arr[%d] = %d.\n", i, arr[i]);
int arr[5] = {1, 2, 3,};
arr表示arr[0]的首地址,arr + 1表示arr[1]的首地址,arr+2表示arr[2]的首地址
其实这里的[ ],可以近似看成 * 。
*arr == 1, *(arr + 1) == 2,
arr[0] == 1, arr[1] == 2. //arr[1] == *(arr+1)
地址加1 一般表示地址加上一个'该地址所指向的空间的类型大小'的长度.
&arr+1 表示地址加上一个int[5]空间大小的字节长度。

数组名arr表示数组首地址,类型是一个数组类型int[5]
当他参与运算时(例如arr+1),arr进行了从数组到指针的隐式转换。arr是作为指针而不是数组名参与运算的。
但是数组名不是指针,只不过在运算时转换成’指向元素类型的指针’参与运算。

数组名不是常量,他们是常量表达式中的地址常量表达式,不占内存空间,所以不能被赋值,不能自增或者自减。
常量和常量表达式是不同的。常量占用空间,但不能被改变。常量表达式比如5,4+5
赋值表达式的左值必须是代表一段内存空间的变量或者结果表示一段空间的表达式。

通过下标使用数组中的各元素时,要注意下标越界问题。
数组下标越界时,编译器不检查,因为要提高效率,越界时得到的是随机值,也就是垃圾值。

函数调用时,传参仅仅只是值传递。
当把数组名作为实参传递时,形参相对应的应该定义一个指针变量来保存这个值,这个变量指向数组首元素的首地址。
数组名只是一个地址常量表达式,所以不能自增自减,而形参定义的是一个变量,变量的值是可以改变的,可以自增自减。
当以某个数组的数组名为实参传递时,应该同时传递该数组的元素个数,以防止下标越界。

字符数组

char arr1[] = "hello";//未规定数组长度,默认为6,hello\0
char arr2[] = "hello";
char *p1 = "hello";
char *p2 = "hello";

定义字符数组arr,将这6个字符定义在内存中的栈区(局部数组)或者全局变量区(全局数组)。
并且arr1 不等于arr2,因为他们所指向的是不同的空间
定义字符指针p,将这六个字符定义在常量区,这段空间是不能被改变的
这是p1 == p1 ,因为这两个指针指向同一段空间,都指向常量区的这6个字符。

C语言里没有字符串的原生类型,所有的字符串都是以字符数组的形式存储在内存中。
字符指针只是指向了字符串的首地址,以’\0’结束,整个区间就是字符串(不包含’\0’,因为strlen(p1) == 5)

内存可以分为堆区,栈区,全局变量区,常量区。
或者代码段(常量区),数据段(全局变量区),堆栈段。

字符数组初始化

char buf1[6] = {'A', 'B', '\0', 'D', 'E'};//完全初始化
char buf2[] = {'A', 'B', 'C'}; //未指定元素个数的初始化,会默认为完全初始化,默认元素个数为3
char buf3[] = {65, 66, 67,}; //存放字符时是以其asc码值存放的,
char buf_1[] = {65, 66, 0};
char buf_2[] = "ABC"; //这里的字符数组有4个元素,最后一个'\0'
char buf_3[] = {"ABC"};//4个元素

多维数组

多维数组在内存中实际上是以一维数组的方式存放的,只是数组名参与运算时转换成的指针所表示的指针维度不同。

int arr1[2][3] = {{1, 2, 3,}, {4, 5, 6}};
int arr2[2][3] = {1, 2, 3, 4, 5, 6};
//arr[1][2]或者 *(*(arr+1)+2) 和 ((int *)arr)[5]或者*((int *)arr+5)都表示第二行第3个元素,即第6个元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值