c语言中数组int*,C语言数组

本文详细介绍了C语言中的数组概念,包括初始化、内存布局、数组名的含义以及数组与指针的关系。同时讲解了字符数组、字符串数组、多维数组以及变长数组的特性,并给出了相关示例。还提到了零长数组和越界访问的概念,以及字符串常量的使用和注意事项。
摘要由CSDN通过智能技术生成

数组的基本概念

数组就是一个可以一次性定义多个相同类型的变量,并可以放到一个连续的内存中去。

fa1a1b4f86c8529cd2ea5c605c7f4d74.png

初始化

只有在定义的时候顺便赋值才叫初始化。

int a = 1024 ; int arr[5] = {1,2,3,4,5}; // 完全初始化

int arr1[] = {1,2,3,4,5,6,7,8,9,10} // 正确,定义的时候并没有确定大小, 初始化后才确定的大小

arr2 = {1,2,3,4,5,}// 不可行, 数组只有在初始化的时候可以统一赋值

int arr2 [5] = {1,2,3,4,5,6,7}; // 语法上可以,但是逻辑上不允许, 涉嫌越界

int arr3[50] = {1,2,3,4,5}; // 不完全初始化 , 没有初始化部分自动填充0

数组名字的含义

数组名在不同的环境中表示的意思不一样

表示整个数组

a.在定义的时候 int a[10];

b.在sizeof(a)语句中;

c.在取地址&a时。

表示数组首元素的首地址

a.除了上面三种情况以外,其他所有情况都表示首元素的首地址。

数组元素引用

存储方式:一片连续的内存空间,按照具体的数据类型进行分割

数组下标:以数组首地址为起点的偏移量

2512989016c55507e660bb851b17d643.png

int arr1[5] = {1, 2, 3, 4, 5};

printf("arr1[1]:%pn", &arr1[1]);

printf("arr1[2]:%pn", &arr1[2]);

printf("arr1[3]:%pn", &arr1[3]);

printf("arr1[4]:%pn", &arr1[4]);

printf("arr1[5]:%pn", &arr1[5]);

//输出结果,可得相邻的数组元素地址相差4,与数组的类型所占的大小相等

arr1[1]:0x7fffeec8c1f4

arr1[2]:0x7fffeec8c1f8

arr1[3]:0x7fffeec8c1fc

arr1[4]:0x7fffeec8c200

arr1[5]:0x7fffeec8c204

注意:

1.一位数组中arr表示首元素的起始地址,&arr表示整个数组的起始地址,虽然值是一样的但是代表的意义却不一样;

2.arr+1与arr[1],arr+2与arr[2].....arr+n与arr[n]是相同的意思;

3.a[1]与1[a],a[2]与2[a]....a[n]与n[a]是相同的意思。

字符数组、字符串数组

专门用来存放字符数据的数组,成为字符数组。

char s1 [5] = {'a' ,'b' , 'c' ,'d' , 'e'}; // 中存放的是字符数据

char s2 [6] = {'a' ,'b' , 'c' ,'d' , 'e' , ' '}; // 中存放的是字符串数据

char s3 [6] = {"hello"} ; // s3中存放的是字符串 , 注意数组大小必须能完整存储下整个字符串包括结束符

char s4 [6] = "hello"; // 使用双引号的时候大括号可以省略

s4[1] = 'E' ;

printf("s1:%sn" , s1 );  // 注意该数组为字符数组,不应该使用%s来访问输出,他会涉嫌越界,%s需要遇到' '才愿意停下来

printf("s2:%sn" , s2 );  // 常规操作 printf("s2:%sn" , s2+2 );   s2+2 加了两个 char 的大小 ,

printf("s3:%sn" , s3 );

printf("s4:%sn" , s4 );

多维数组

二维数组可以理解为:数组内容为数组。

4cac9378cfa7a361943376b13dc99d1f.png

/* 测试代码 */

int arr[3][3] = {{1, 11, 111} ,

{2, 22, 222} ,

{3, 33, 333}};

printf("&arr: %pn", &arr);

printf("&arr+1:%pn", &arr+1);

printf("arr[0][0]:%pn", *arr+0);

printf("arr[0][1]:%pn", *arr+1);

printf("arr[0][2]:%pn", *arr+2);

printf("arr[0][0]:%pn", *(arr+0));

printf("arr[1][0]:%pn", *(arr+1));

printf("arr[2][0]:%pn", *(arr+2));

printf("arr[0][1]:%dn", *(*(arr+0)+0));

printf("arr[0][2]:%dn", *(*(arr+0)+1));

printf("arr[0][3]:%dn", *(*(arr+0)+2));

注意:

1.如果将代码中的&arr,arr+0,(arr+0)传递给相应的指针,其所代表的意义也将传递给指针。

零长数组

长度为零的数组

int a[0];

其主要的功能是放在结构体的末尾,作为结构的最后一个成员,可以作为结构体内存扩容入口,数组是C语言中唯一一个允许越界访问的东西。

c92ab5a32b1bbb4a32d49e78438a2b79.png

越界访问:只是访问本来不属于某个变量的内存(数组原本申请大区域)不一定就是非法访问

越界是访问的内存只要都属于我当前程序所用的内存就不属于非法访问。

非法访问:访问的内存地址不属于你这个程序的内存。

变长数组

概念: 在定义数组之前可能他的长度是未知的, 定义语句执行后他的长度是固定的。

重点: 在定于语句中数组的长度是一个变量,定义结束之后即使长度的变量有所变化也不会影响数组的长度了。

说白了就是数组的长度是一个变量;

int i = 90 ; 。。。 。。 int buf[ i ] ;

int a = 10 ; int arr[ a ] = {0} ;  //  error: variable-sized object may not be initialized

注意:

变长数组不可以初始化。

指针数组

用来存放指针的数组

int * arr[5] ;

int a , b ,c ,d, e ;

arr[0] = &a ;

arr[1] = &b ;

char * str [3] = {"Hello" , "GZ2075" , "eVEN"};

for (int i = 0; i 

{

printf("str[%d]:%sn" , i , str[i]);

}

字符串常量

常量:不可以被修改的量

存储在常量区的字符串数据称为字符串常量,实际上是一个匿名数组

printf("%dn" , sizeof("GZ2075")); // "GZ2075"表示的整个数组

printf("%pn" , &"GZ2075"); // "GZ2075"表示的整个数组

printf("%cn" ,"GZ2075"[1]); // 使用与数组类似的方法来访问某一位元素

char * p1 = "GZ2075" ; // p1指向 "GZ2075" 匿名数组的首元素的首地址

char * p2 = "GZ2075" + 1; // p2 指向 "GZ2075" 匿名数组的第二个元素 ‘Z’

注意:

字符串常量都是以' '结尾的,不可忽略它的存在。

内容来源于网络如有侵权请私信删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值