数组;数组初始化
===============================================================================================
数组就是在内存中连续的相同类型的变量空间。同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的。
一个数组可以分解为多个数组元素:这些数组元素可以是基本数据类型或构造类型。
按数组元素类型的不同,数组可分为:数值数组、字符数组、指针数组、结构数组等类别。
int a[10];
char s[10];
char *p[10];
-------------------------------------------------------------------------------------------
数组名字符合标识符的书写规定(数字、英文字母、下划线)
数组名不能与其它变量名相同,同一作用域内是唯一的
方括号[]中常量表达式表示数组元素的个数
int a[3]表示数组a有3个元素
其下标从0开始计算,因此3个元素分别为a[0],a[1],a[2]
定义数组时[]内最好是常量,使用数组时[]内即可是常量,也可以是变量
-------------------------------------------------------------------------------------------
//数组初始化
int main(void)
{
//数组的存储空间是连续的!
int arr[6] = {1,2,3,4,5,6};
printf("%x\n", arr); //内存地址:8c71fa08 //属组的第一个元素地址就是属组的起始地址;数组名是一个地址的常量,代表数组中首元素的地址。
printf("%x\n", &arr[0]); //内存地址:8c71fa08
printf("%x\n", &arr[1]); //内存地址:8c71fa0c
printf("%x\n", &arr[2]); //内存地址:8c71fa0c
printf("%p\n", &arr[3]); //内存地址:000000128C71FA14
printf("%p\n", &arr[4]); //内存地址:000000128C71FA18
printf("%p\n", &arr[5]); //内存地址:000000128C71FA1C
printf("%u\n", sizeof(arr)); //数组arr[6]占用内存24字节
printf("%u\n", sizeof(arr[0])); //数组arr[6]元组占用内存4字节
printf("%u\n", sizeof(arr)/sizeof(arr[0])); //数组元素个数:6
int arr2[10] = { 1,2,3,4,5,6,7,8,9,10 }; //数组初始化方式1【常用】
for (size_t i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++) {
printf("%i;", arr2[i]); //1;2;3;4;5;6;7;8;9;10;
}
int arr3[10] = { 1,2,3,4,5,6,7 }; //数组初始化方式2,未赋值的元素默认为0【常用】
//int arr3[10] = { 0 }; //数组初始化方式2,未赋值的元素默认为0
arr3[7] = 8;
for (size_t i = 0; i < sizeof(arr3) / sizeof(arr3[0]); i++) {
printf("%i;",arr3[i]); //1;2;3;4;5;6;7;0;0;0; //1;2;3;4;5;6;7;8;0;0;
}
int arr4[10] ; //数组初始化方式3,元素默认为随机数
for (size_t i = 0; i < sizeof(arr4) / sizeof(arr4[0]); i++) {
printf("%i;", arr4[i]); //-858993460;-858993460;-858993460;-858993460;-858993460;-858993460;-858993460;-858993460;-858993460;-858993460;
}
int arr5[] = { 1,2,3,4,5,6, }; //数组初始化方式4,定义数组时,可以不指定数组长度【常用】
for (size_t i = 0; i < sizeof(arr5) / sizeof(arr5[0]); i++) {
printf("%i;", arr5[i]); //1;2;3;4;5;6;
}
}
数组;数组初始化
一维数组代码示例:数组倒序;冒泡排序
====================================================================================
//数组倒序显示
int main(void)
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int a = sizeof(arr) / sizeof(arr[0]);
for (size_t i = a; a-1 >= 0; a--) {
printf("%d;",arr[a-1]); //10;9;8;7;6;5;4;3;2;1;
}
}
-------------------------------------------------------------------------------------
//数组倒序
int main(void)
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int a = sizeof(arr) / sizeof(arr[0]);
int aaa;
for (size_t i = 0; i < a/2; i++) {
aaa = arr[i];
arr[i] = arr[a - 1 - i];
arr[a - 1 - i] = aaa;
}
for (size_t j = 0; j < a; j++) {
printf("%d;", arr[j]);
}
}
-------------------------------------------------------------------------------------
int main(void)
{
//冒泡排序
int arr[] = { 1,4332,54,3,8,5,43,754,7,456,3,2,42341,6,7, };
int len = sizeof(arr) / sizeof(arr[0]);
int min;
for (size_t i = 0; i < len-1; len -- ) {
for (size_t j = 0; j < len-1; j++) {
if (arr[j] < arr[j + 1]) {
min = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = min;
}
}
}
for (size_t x = 0; x < sizeof(arr) / sizeof(arr[0]); x++) {
printf("%d ", arr[x]); //42341 4332 754 456 54 43 8 7 7 6 5 3 3 2 1
}
}
-------------------------------------------------------------------------------------
#include <stdio.h>
//冒泡排序2
int main()
{
int a[] = { 1, -2, 3,- 4, 5, -6, 7, -8, -9, 10 };//定义一个数组,同时初始化所有成员变量
int i = 0;
int j = 0;
int n = sizeof(a) / sizeof(a[0]);
int tmp;
//1、流程
//2、试数
for (i = 0; i < n-1; i++)
{
for (j = 0; j < n - i -1 ; j++)//内循环的目的是比较相邻的元素,把大的放到后面
{
if (a[j] > a[j + 1])
{
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
for (i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
一维数组代码示例:数组倒序;冒泡排序
二维数组;二维数组初始化
==================================================================================================
二维数组的初始化:
1)常规初始化:
int arr[3][5] = {{2, 3, 54, 56, 7 }, {2, 67, 4, 35, 9}, {1, 4, 16, 3, 78}};
2) 不完全初始化:
int arr[3][5] = {{2, 3}, {2, 67, 4, }, {1, 4, 16, 78}}; 未被初始化的数值为 0
int arr[3][5] = {0}; 初始化一个 初值全为0的二维数组
int arr[3][5] = {2, 3, 2, 67, 4, 1, 4, 16, 78}; 【少见】 系统自动分配行列。
3)不完全指定行列初始化:
int arr[][] = {1, 3, 4, 6, 7}; 二维数组定义必须指定列值。
int arr[][2] = { 1, 3, 4, 6, 7 }; 可以不指定行值。
int main(void)
{
//二维数组的初始化方法
int arr1[3][3] = { {1,2,3}, {2,3,4}, {3,4,3}, }; //初始化方式1
int arr2[3][4] = { {1,2,}, {2,4}, {3,4,3}, }; //初始化方式2:数组指定的元素不要超过数组的限制就可以;未赋值的元素默认为0
int arr3[3][4] = { 0 }; //初始化方式3,所有元素均为0
int arr4[][4] = { {1,2,3}, {2,3,4}, }; //初始化方式4,二维数组初始化必须指定列值
}
----------------------------------------------------------------------------------
大小:
数组大小: sizeof(arr);
一行大小: sizeof(arr[0]): 二维数组的一行,就是一个一维数组。
一个元素大小:sizeof(arr[0][0]) 单位:字节
行数:row = sizeof(arr)/ sizeof(arr[0])
列数:col = sizeof(arr[0])/ sizeof(arr[0][0])
地址合一:
printf("%p\n", arr); == printf("%p\n", &arr[0][0]); == printf("%p\n", arr[0]);
数组的首地址 == 数组的首元素地址 == 数组的首行地址。
二维数组;二维数组初始化
字符数组与字符串区别;字符串初始化;字符串的输入输出:scanf、puts、fputs、gets、fgets
==============================================================================================
字符数组与字符串区别
C语言中没有字符串这种数据类型,可以通过char的数组来替代;
字符串一定是一个char的数组,但char的数组未必是字符串;(也就是说C的字符串是一种特殊的char数组)
数字0(和字符‘\0’等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char的数组。
----------------------------------------------------------------------------------------------
//字符串初始化
int main()
{
char buf[] = { 'a', 'b', 'c' }; //不指定长度, 没有0结束符,有多少个元素就有多长
printf("buf = %s\n", buf); //乱码
char buf2[100] = { 'a', 'b', 'c' }; //指定长度,后面没有赋值的元素,自动补0
char buf[1000]={“hello”};
printf("buf2 = %s\n", buf2);
char buf3[100] = { 0 }; //所有元素赋值为0
//char buf4[2] = { '1', '2', '3' };//数组越界
char buf5[50] = { '1', 'a', 'b', '0', '7' };
printf("buf5 = %s\n", buf5);
char buf6[50] = { '1', 'a', 'b', 0, '7' };
printf("buf6 = %s\n", buf6);
char buf7[50] = { '1', 'a', 'b', '\0', '7' };
printf("buf7 = %s\n", buf7);
char buf8[] = "agjdslgjlsdjg"; //使用字符串初始化,编译器自动在后面补0,常用
//'\0'后面最好不要连着数字,有可能几个数字连起来刚好是一个转义字符
//'\ddd'八进制字义字符,'\xdd'十六进制转移字符
// \012相当于\n
char str[] = "\012abc";
printf("str == %s\n", str);
return 0;
}
----------------------------------------------------------------------------------------------
字符串的输入输出:scanf、puts、fputs、gets、fgets
int main(void)
{
//scanf、gets 都是不安全的函数
//scanf函数
char str[100];
printf("input string1 : \n");
scanf("%s", str);//scanf(“%s”,str)默认以空格分隔
printf("output:%s\n", str);
//puts函数:标准设备输出s字符串,在输出完成后自动输出一个'\n'。
//fputs函数:将str所指定的字符串写入到stream指定的文件中, 字符串结束符 '\0' 不写入文件。
puts("hello wrold"); //输出到屏幕,自动换行
printf("hello world"); //输出结果:无换行
fputs("hello world", stdout); //输出结果:无换行
//strlen函数:计算指定指定字符串s的长度,不包含字符串结束符‘\0’
char str0[] = "hello world";
printf("str length is %lld\n", sizeof(str0)); //str length is 12
printf("str length is %lld\n", strlen(str0)); //str length is 11;strlen碰到\0结束
//gets函数:从标准输入读入字符,并保存到s指定的内存空间,直到出现换行符或读到文件结尾为止。
//char str1[100];
//printf("请输入str1: ");
//gets(str1);
//printf("str1 = %s\n", str1);
//fgets函数:从stream指定的文件内读入字符,保存到s所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 '\0' 作为字符串结束。
char str2[100];
printf("请输入str2: ");
fgets(str2, sizeof(str2), stdin); //fgets可以从文件读取内容;此处stdin表示从键盘获取输入
printf("str2 = \"%s\"\n", str2);
}
//scanf接收'空格'
char arr[1000];
//scanf("%[^\n]", arr);
scanf("%[^\n]s", arr); //有没有s都可以????
printf("%s", arr);
gets(str)与scanf(“%s”,str)的区别:
gets(str)允许输入的字符串含有空格
scanf(“%s”,str)不允许含有空格
字符数组与字符串区别;字符串初始化;字符串的输入输出:scanf、puts、fputs、gets、fgets
字符串数组初始化
char str[] = "hello"; //方式1
char str[] = {'h','e','l','l','o','\0',}; //方式2
char str[100] = {'h','e','l','l','o',}; //方式3,默认为'\0'
char *str = "hello"; //方式4
char *str = {'h','e','l','l','o','\0',}; //这种方式不允许
char str[] = {'h','e','l','l','o',}; //这是字符数组,不是字符串!!!!!
//字符串拼接
int main()
{
char str1[] = "abcdef";
char str2[] = "123456";
char dst[100];
int i = 0;
while (str1[i] != 0)
{
dst[i] = str1[i];
i++;
}
int j = 0;
while (str2[j] != 0)
{
dst[i + j] = str2[j];
j++;
}
dst[i + j] = 0; //字符串结束符
printf("dst = %s\n", dst);
return 0;
}
示例:字符串拼接