数组是一组相同类型元素的集合
一维数组的创建和初始化
创建:
type_t(类型)arr_name(数组名)[const_n](常量表达式<数组大小>)
eg:
int n = 0;
scanf("%d",&n);
int a[n]; 此处错误,不能为变量应需常量
初始化:
eg:
int a[3+5] = {1,2,3}; 不完全初始化,数组里内容为12300000
int a[ ] = {1,2,3}; 没指定数组的大小,数组的元素个数根据初始化的内容来确定
char a[5] = {'a',98,'c'); char类型,数组里内容为abc
char arr[ ] = {"abc"}; 数组内容97'a' 98'b' 99'c' 0'/0'
char arr1[ ] = {'a','b','c'}; 数组内容97'a' 98'b' 99'c'
printf("%s\n",arr); //abc (字符串后有/0)
printf("%s\n",arr1); //abc烫烫烫 (字符串要有/0结束,此数组中没有输出随机值烫烫烫)
printf("%d\n",strlen(arr)); //3 (字符串求长度以'/0'为结束,但它不算在长度中)
printf("%d\n",strlen(arr1)); //随机数 (没有/0)
一维数组的使用
[](下标引用操作符)
总结:1.数组是使用下标来访问的,下标是从0开始的。
2.数组的大小可以通过计算得到 int sz = sizeof(arr)/sizeof(arr[0]);
eg:
1.
double arr[3];
arr[ ] = {1.0,2.0}; 错误,没有明确指出下标是那两个
2.
void test(int arr[ ],int sz) 不用写,不用建立新数组不需要知道大小;指针大小不需要知道大小
{
}
int main()
{
int arr[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]); 求数组大小
test(arr,sz);
return 0;
}
一维数组在内存中的存储
随着数组下标的增长,元素的地址,也在有规律的递增。
结论:数组在内存中是连续存放的。
指针的初步介绍
结论:1.内存中的每一个内存单元(字节)对应一个地址。
2.在32位的平台上指针的大小是4个字节。
在64位的平台上指针的大小是8个字节。
<指针是一个专门用来存放地址的一个变量>
eg:
int *ptr = NULL; //定义一个整型的指针变量,初始化为NULL
char *ptr = NULL; //定义一个字符的指针变量,初始化为NULL
一维数组的指针访问
数组的数组名是数组首元素的地址
数组名+整数的运算可以获取到数组每个元素的地址
二维数组的创建和初始化
//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];
//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[ ][4] = {{2,3},{4,5}}; 只能省略行不能省略列
二维数组的使用<通过下标的方式>
二维数组在内存中的存储
结论:二维数组在内存中也是连续存储的。
数组的性质
1.二维数组名是第一行的地址
2.数组名单独放在sizeof内部表示整个数组:sizeof(数组名)计算的是整个数组的大小,单位是字节。
&数组名取数组地址
除此之外数组名都表示首元素地址
有关数组的运算
1.一维数组
16:数组名在sizeof内部代表整个数组的大小 1个整型占4个字节 为:4*4=16
4:此时数组名代表首元素的地址+0 还是首元素的地址 地址都占4个字节 为:4
4:此时数组名代表首元素的地址*解引用 为首元素 1个整型占4个字节 为:4
4:此时数组名代表首元素的地址+1 为第二个元素的地址 地址都占4个字节 为:4
4:a[1]为首元素 1个整型占4个字节 为:4
4:&a取出整个数组的地址 地址都占4个字节 为:4
16:&a取出整个数组的地址*解引用为整个数组的大小 1个整型占4个字节 为:4*4=16
4:&a取出整个数组的地址+1 跳过一个数组指向数组后面的位置 地址都占4个字节 为:4
4:&a[0]取出首元素的地址 地址都占4个字节 为:4
4:&a[0]取出首元素的地址+1指向第二个元素的地址 地址都占4个字节 为:4
2.字符数组
6:数组名在sizeof内部代表整个数组的大小 1个字符型占1个字节 为:1*6=6
4:此时数组名代表首元素的地址+0 还是首元素的地址 地址都占4个字节 为:4
1:此时数组名代表首元素的地址*解引用 为首元素 1个字符型占1个字节 为:1
1:arr[1]为首元素 1个字符型占1个字节为:1
4:&arr取出整个数组的地址 地址都占4个字节 为:4
4:&arr取出整个数组的地址+1 跳过一个数组指向数组后面的位置 地址都占4个字节 为:4
4:&arr[0]取出首元素的地址+1指向第二个元素的地址 地址都占4个字节 为:4
19:随机数 没有遇见/0不会停止
19:随机数 没有遇见/0不会停止
注释的是错误的 strlen接收的是地址 strlen只能用char*作参数
19:随机数 没有遇见/0不会停止
13:随机数 没有遇见/0不会停止
18:随机数 没有遇见/0不会停止
7:数组名在sizeof内部代表整个数组的大小 1个字符型占1个字节 \0也是一个字符 为:1*7=7
4:此时数组名代表首元素的地址+0 还是首元素的地址 地址都占4个字节 为:4
1:此时数组名代表首元素的地址*解引用 为首元素 1个字符型占1个字节 为:1
1:arr[1]为首元素 1个字符型占1个字节为:1
4:&arr取出整个数组的地址 地址都占4个字节 为:4
4:&arr取出整个数组的地址+1 跳过一个数组指向数组后面的位置 地址都占4个字节 为:4
6:数组名代表首元素地址 遇到/0停止 不包含/0 字符串长度为:6
6:数组名代表首元素地址+0还是首元素地址 遇到/0停止 不包含/0 字符串长度为:6
注释的为错误的 strlen接收的是地址 strlen只能用char*作参数
6:&arr取出整个数组的地址 遇到/0停止 不包含/0 字符串长度为6
12:随机值 &arr取出整个数组的地址+1 跳过一个数组指向数组后面的位置 没有/0 不能停止
5:&arr[0]取出首元素的地址+1指向第:二个元素的地址 遇到/0停止 不包含/0 字符串长度为:5
4:指针变量 地址都占4个字节 为:4
4:指针变量p+1 指向第二个元素 地址都占4个字节 为:4
1:首元素 1个字符型占1个字节 为:1
1:首元素 1个字符型占1个字节 为:1
4:指针变量的地址 地址都占4个字节 为:4
4:指针变量的地址+1 地址都占4个字节 为:4
4:第二个元素的地址 地址都占4个字节 为:4
6:p指向字符串 遇到/0停止 不包含/0 字符串长度为:6
5:p指向字符串+1 从第二个元素 遇到/0停止 不包含/0 字符串长度为:5
注释的为错误的 strlen接收的是地址 strlen只能用char*作参数
3:随机值 指针变量的地址 遇到\0才停止
7:随机值 指针变量的地址+1 遇到\0才停止
5:从第二个元素开始 遇到/0停止 不包含/0 字符串长度为5
48:数组名在sizeof内部代表整个数组的大小 1个整型占4个字节 为:4*12=48
4:首元素 1个整型占4个字节 为:4
16:第一行的元素 1个整型占4个字节 一行4个整型 为:4*4=16
4:指向第一行第二个元素 地址总是4个字节 为:4
4:指向第二行 地址总是4个字节 为:4
4:&a[0]第一行地址+1 指向第二行 地址总是4个字节 为:4
16:第一行的元素 1个整型占4个字节 一行4个整型 为:4*4=16
16:类似于a[0] 1个整型占4个字节 一行4个整型 为:4*4=16
结论:二维数组要看首元素的地址,首先要把二维数组想象成一维数组