数组
什么是数组:
数组是用来存储多条相同数据类型数据的数据结构。(容器)
数组是存储多个统一数据类型变量的容器,数组中每一个数据叫元素,数组由多个元素组成。
数据下标来区分数据中的元素。元素从数组的位置0开始。
元素可以使用数组变量名[下标]来得到具体的元素
数组中元素的个数叫数组的长度
数组所占的空间=元素的类型*数组的长度
数组名指向的区域,是数组在内存中的首地址
数组的语法格式:
// 定义数组:元素类型 数组名[元素个数];
int array[3];
// 访问元素:数组名[下标]
array[0] = 10;
数组下标
下标是指访问数组元素时,中括号中的数字
下标不能越界,如果越界,可能会导致以下后果:
程序直接崩溃
莫明的该变来其他变量或数据空间的值
什么事儿都没有
数组的初始化
初始化
赋使用的值
int array1[3] = {3,4,5}; // 依次给数组元素赋值
int array2[3] = {1,2}; // 如果赋值的个数少于数组的长度,会自动用0来填充后面的值
赋零值
int array3[3]; // 未初始化,可能存在垃圾值
int array4[3] = {0}; // 数组中每个元素是0
数组名和数组首地址
数组名是一个地址,而且是不可变的地址
数组名不可以作为左值,就是不能出现在赋值语句的左边。初始化除外。
数组名是常量(指针)。所以不能赋值。
数组的赋值和拷贝
数组的赋值
int array[10];
array[2] = 10; // 将数组的第三个元素赋值未10
数组的拷贝
int array[10] = {1,2,3,4,5,6,7,8,9,0};
int num[10];
for (int i = 0; i < 10; i++)
num[i] = array[i];
数组的遍历
数组的正向遍历
int array[10] = {1,2,3,4,5,6,7,8,9,0};
for (int i = 0; i < 10; i++)
printf("%d ", array[i]);
数组的反向遍历
for (int i = 9; i>=0; i--)
printf("%d ", array[i]);
随机数
rand()函数用于生成一个随即数
srand()函数用于定义随机种子
int main()
{
srand((unsigned)time(0));
for (int i = 0; i < 10; i++){
int x = rand()%100;
printf("%d ",x);
}
printf("\n");
return 0;
}
二维数组
数组的数组
定义数组:元素类型 数组名[元素个数][元素个数]
int array[3][4];
array[1][2] = 10;
二维数组的初始化
二维数组的初始化
对应元素内容
int array[3][2] = {{1,2},{3,4},{5,6}};
整体赋值
int array[3][2] = {1,2,3,4,5,6};
依次赋值 自动补零
int array[3][2] = {1,2,3,4}
二维数组的数组名
二维数组名同样是一个地址,而且是不可变的地址。
二维数组名同样不可以作为左值,就是不能出现在赋值语句的左边。初始化除外。
二维数组名是常量(指针)。所以不能赋值。
指针
什么是指针
内存被分为字节,每个字节有唯一的地址,指针指的就是内存地址。
保存指针的变量,就叫指针变量。(保存地址)
声明一个指针变量
int i = 0;
int * p; // 声明一个指针变量 int * 指针类型
每个指针变量能指向一种特定类型的对象(地址,内存区域)。
指针是引用数据类型,因为本身没有保存数据,只是保存了数据的地址,间接的找到内存中的数据。
// 值传递
void swap1(int a, int b){
int temp = a;
a = b;
b = temp;
}
// 地址传递
void swap2(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int main(){
int a = 5, b = 8;
swap1(a,b);
printf("%d %d", a, b);
swap2(&a, &b);
printf("%d %d", a, b);
}
指针用于返回值
指针也可以作为返回值
不要返回自动变量的地址,因为局部变量的生命周期仅在函数内部,当函数结束,局部变量会被自动清除(释放)。解决方法:延长生命周期。
指针加、减操作
指针支持加整数、减整数、指针的比较和相减,但运算的单位由指针的类型决定。
int类型指针+1 = 地址+4
char类型指针+1 = 地址+1
指针与数组区别
占用内存空间
数组占用空间 = 数组元素占用的空间*长度
指针占用空间 = 在64位系统下,8个字节,固定的,一直在的类型没关系。
赋值
数组名是常量,是不可以修改其值
指针是变量,可以多吃赋值
对指针的赋值,本质上是指针指向的改变
字符串
什么是字符串
用双引号引起来的多个字符,以‘\0’结尾
“I am a string.\n”
"a string""other string" ==>"a string other string";
"a string \
string" ==> "a string string";
字符串与普通字符数组的区别
字符数组
是字符类型的数组
每个数组元素保存一个字符
字符串
是字符指针变量
指向字符串中第一个字符的地址
字符串的定义方式
字面值“Hello”
printf("Hello");
使用字符数组来定义字符串
char str[10] = {'H','e','l','l','o','\0'};
使用字符指针
char * str2 = str;
字符串的使用
声明的变量,放在内存中的栈区。
字面值方式创建的字符串,放在内存中的代码区,如果创建的是字符串,并且值是相同的,只会创建一个内存区域,其值是只读的,值不可以改变。
使用数组方式创建的字符串,放在内存中的栈区,可以创建多个相同的字符串,其值可以改变。
字符指针,只是指向了内存的一个区域。
希望持续关注,如有疑问请回复!谢谢!