Bootstrap

数组

数组是一组相同类型元素的集合

一维数组的创建和初始化

创建:

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

结论:二维数组要看首元素的地址,首先要把二维数组想象成一维数组


;