今天来整理一些数组的相关知识
1,一维数组的创建和初始化
数组的创建方式: type_t arr_name [const_n]
数组元素类型 数组名 常量表达式,用来指定数组大小
数组创建时,[ ]中要给一个常量才可以,不能使用变量
数组的初始化:在创作数组的同时给数组的内容一些合理的初始值
数组的内存分配:
Eg: char arr1[] = “abc”-------------------4个元素(包含一个”\0”)
Char arr2[] ={‘a’, ’b’, ’c’} ---------3个元素
Char *p=”abcdef” ---------------------*p中放a的地址
2,一维数组的使用
数组访问操作符:[ ]
数组是使用下标来访问的,下标是从0开始的。
数组的大小可以通过计算得到
eg: int arr[10]
Int sz=sizeof(arr)/sizeof(arr[0]);
3,一维数组在内存中的存储
数组在内存中是连续存放的。
4,指针的初步介绍
内存中的每一个内存单元(字节)对应一个地址
在32位平台上指针的大小是4个字节,64为平台上是8个字节
指针可以理解为一个变量,是一个专门用来存放地址的变量
Eg: int n=10
Int *p_n=&n; -------------------将n的地址存放在p_n指针变量中
*p_n=20;---------------------改变的其实是n这个变量的内容
5,一维数组的指针访问
解引用操作符“*”的作用:当拿到指针的时候也能找到指针所指向的变量。
数组的数组名其实是数组首元素的地址。
Arr+1:同过对数组名加整数的运算,可以获取到数组每个元素的地址。
下面举例说明地址解引用:
Eg: # include <stdio.h>
Int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,0};
Printf(“%p\n”,arr);-----------------------输出的是首元素的地址
Printf(“%d\n”,*arr);------------------------输出的是首元素 1
Return 0;
}
6,二维数的初始化
Eg: int arr [3][4]={1,2,3,4};
int arr [3][4]={{1,2}, {3,4}};
int arr [ ][4]={{1,2}, {3,4}};------------------初始化时,元素个数行可省,列不可省。
7,二维数组在内存中的存储
二维数组在内存中是连续存储的,且是按行存储。将二维数组视为一维数组时,每一行 相当于一维数组的第一个元素,二维数组的数组名和第一行的行标合起来可看作一个数组名。
8,关于数组的运算
数组名代表整个数组时只有两种情况:
(1). sizeof(数组名):计算这个数组的大小
(2). &数组名:取出的是数组的地址
除此以外,所有数组名都表示数组首元素的地址
Eg: int a[ ]={1,2,3,4}
Printf(“%d\n”,sizeof(*&a));------------------------------输出16
Char arr[ ]={‘a’,’b’,’c’,’d’,’e’,’f’};
Printf(“%d\n”,sizeof(*arr));--------------------------------输出1
Printf(“%d\n”,sizeof(arr[1]));------------------------------输出1
Printf(“%d\n”,strlen(*arr));--------------------------------内存访问出错
Printf(“%d\n”,strlen(arr[1]));------------------------------内存访问出错
Printf(“%d\n”,strlen(&arr));-------------------------------输出随机值
Char arr[ ]=”abcdef”;
Printf(“%d\n”,strlen(arr+0));------------------------------输出6
Printf(“%d\n”,strlen(&arr));-------------------------------输出6
Printf(“%d\n”,strlen(&arr+1));----------------------------输出随机值
Char *p=”abcdef”;
Printf(“%d\n”,strlen(&p));----------------------------------输出随机值
Printf(“%d\n”,strlen(&p[0]+1));---------------------------输出5
Int a[3][4]={0};
Printf(“%d\n”,sizeof(a[0]+1));------------------------------输出4(表示第一行第二个元素的地址)
首元素地址
Printf(“%d\n”,sizeof(a+1));----------------------------------输出4(表示第二行地址)
第一行地址
Printf(“%d\n”,sizeof(&a[0]+1));----------------------------输出4(表示第二行地址)
Printf(“%d\n”,sizeof(*a));------------------------------------输出16
Printf(“%d\n”,sizeof(a[3]));----------------------------------输出16(表示第四行)
***只要是地址,无论何种类型,都占四个字节
***一个p指针有4个字节的空间
9,数组作为指针参数
数组作为函数参数时,不会把整个数组传递过去,实际上只是把首元素的地址传递过去了,所以函数内参数部分写成数组的形式:int arr[ ]表示的是一个指针:int *arr