数组
1.数组的类型
char/int arr[10]---int [10] char arr[3][4]--char [3][4]
3.14会转换为3,存入数组。
2.初始化:
char/int arr[20]={1,2,3};(不完全初始化,其余项都为0);
int
main()
{
char
arr[100] = { 0 };
scanf(
"%s"
, arr);
printf(
"%c"
, arr[2]);
return
0;
}//该代码正确
往数组中输入数字
for (i = 0; i <= 9; i++) {
scanf(
"%d", &arr1[i]);
}
数组下标运算符拥有形式
指针表达式 [ 整数表达式 ] (1)
整数表达式 [ 指针表达式 ] (2)
3.数组为形参传递:
//int binary_search(int arr[], int x,int sz)//arr[]只存储了arr的第一个元素的地址;无法在函数内使用sizeof(arr)/sizeof(arr[0]),计算数组内存。
strlen()计算了arr的元素个数。
sizeof(arr)计算了arr首元素的地址的所占空间的字节大小。
要使用sizeof()计算数组元素个数,就在外面算好后,传入函数内。
1)⽤数组元素作实参时,只要数组类型和函数的形参变量的类型⼀致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是⼀致的。
2)在
普通变量或下标变量
作函数参数时,形参变量和实参变量是由编译系统分配的
两个不同
的内存单元。在函数调⽤时发⽣的值传送是把实参变量的值赋予形参变量。在⽤数组名作函数参数时,
不是进⾏值的传送
,即不是把实参数组的每⼀个元素的值都赋予形参数组的各个元素。因为
实际上形参数组并不存在
,编译系统不为
形参数组分配内存
。数组名就是
数组的⾸地址(arr=&arr[0])
。因此在数组名作函数参数时所进⾏的传送只是
地址的传送
,也就是说把
实参数组的⾸地址赋予形参数组名
。形参数组名取得该⾸地址之后,也就等于有了实在的数组。
实际上是形参数组和实参数组为同⼀数组,共同拥有⼀段内存空间。
注意:数组有两个特殊的性质。⼀是
不能
复制数组;⼆是使⽤数组名字时,数组会⾃动转化为指向其第⼀个元素的指针。由于数组不能复制,所以⽆法编写使⽤数组类型形参的函数,因为数组会被⾃动转化为指针。
Ps:一维数组以int arr[]/int* arr为形参,效果一样,
1.可以调用数组arr中的值(例如)
printf(
"%d\n", arr[1]);
2.改变arr中元素的值
arr[1]=0;
3.可用*arr
printf(
"%d\n", *(arr + 1));
4.arr+1表示arr[1]的地址
arr--数组名--首元素的地址 arr+1---下一元素的地址
&arr[0]--首元素的地址 &arr[0]+1--下一元素的地址
&arr--数组的地址 &arr+1--地址跳过整个数组
除了
其余的数组名都是首元素的地址。
(比如传参的时候,传递的arr就是首元素的地址,用int arr[]或者int* arr接收,可调用arr中的元素,调整arr)
void
bubble_sort(
int
arr
[])
{
int
i = 0;
int
j = 0;
for
(i = 0; i < 9; i++)
{
bool
flag =
true
;
//假设要排序的数组已经排好了
for
(j = 0; j < 9 - i; j++)
{
if
(
arr
[j] >
arr
[j + 1])
{
int
tmp =
arr
[j];
arr
[j] =
arr
[j + 1];
arr
[j + 1] = tmp;
flag =
false
;
//实际上数组没有排好
}
}
if
(flag)
break
;
}
}
如果传入的是arr+1,那么函数接收的数组其实是以第二个元素为首元素的数组。
len=7;
调整arr+1数组,同样会调整原arr数组
4.字符数组
1.ASCII
#include
<stdio.h>
int
main() {
char
c0 =
'A'
;
// 字符由单引号' '包围
char
c1 = 65;
// 字符是一个数字
char
c2 =
'\n'
;
// 特殊字符可用转义
char
c3 =
'\x41'
;
// 用16进制表示字符
char
c4 =
'\101'
;
// 用8进制表示字符
printf(
"%c,%c%c"
, c0, c1, c2);
printf(
"%c,%c"
, c3, c4);
}
输出:
A,A
A,A
2.转义字符
5.数组在内存中是连续存放的
char* p=arr[1]/int* p=arr[1]-->*++p=arr[2]
数组内元素的指针变量加一,此时原指针指向相邻的下一元素
二维数组
1.二维数组的创建:int arr[3][4] 3行4列
2.二维数组的初始化: int arr[3][4]={1,2,3,4,5,}
1 2 3 4
5 0 0 0
0 0 0 0
int arr[3][4]={{1,2,3}{2,4,5}}
1 2 3 0
2 4 5 0
0 0 0 0
二维数组初始化时只能省略行,不能省略列。
对于多维数组,除第一维外的其他维的长度均不能省略。
无论行还是列下标都是从0开始的
3.二维数组在内存中是连续存放的
arr[1],arr[2],arr[3]相当于一维数组
4.二维数组的首元素地址
对于 int m[3][4]; 其存储结构:
m--首元素的地址--&m[0]--整个第0行数组的地址
*m--整个第0行数组--第0行数组的首元素的地址
**m--首元素
m[0]--一维数组--表示m[0]数组首元素的地址
&m[0]--整个m[0]数组的地址