1、数组:一组相同而有序的数据类型的集合,在内存中占一片连续的空间
格式:数据类型 数组名[元素个数];
在
c语言中数组元素个数必须是一个常量。
数组元素个数 = sizeof(数组名)/数据类型大小;
数组名是一个常量,保存的整个数组的首地址; &arr[0] == arr;
2、二维数组定义和使用
本质多个一维数组。
二维数组长度:sizeof(数组名)/sizeof(类型说明符)、sizeof(arr)/sizeof(int)
二维数组的行:sizeof(数组名)/sizeof(一行长度)、sizeof(arr)/sizeof(arr[0])
二维数组的列:sizeof(一行长度)/sizeof(一个元素长度)、sizeof(arr[0])/sizeof(arr[0][0])
#include <stdio.h>
int main()
{
//定义了一个二维数组,名字叫a
//二维数组是本质上还是一维数组,此一维数组有3个元素
//每个元素又是一个一维数组int[4]
int a[3][4] = { 1, 2, 3, 4 , 5, 6, 7, 8, 9, 10, 11, 12 };
//数组名为数组首元素地址,二维数组的第0个元素为一维数组
//第0个一维数组的数组名为a[0]
printf("a = %p\n", a);
printf("a[0] = %p\n", a[0]);
//测二维数组所占内存空间,有3个一维数组,每个一维数组的空间为4*4
//sizeof(a) = 3 * 4 * 4 = 48
printf("sizeof(a) = %d\n", sizeof(a));
//测第0个元素所占内存空间,a[0]为第0个一维数组int[4]的数组名,4*4=16
printf("sizeof(a[0]) = %d\n", sizeof(a[0]) );
//测第0行0列元素所占内存空间,第0行0列元素为一个int类型,4字节
printf("sizeof(a[0][0]) = %d\n", sizeof(a[0][0]));
//求二维数组行数
printf("i = %d\n", sizeof(a) / sizeof(a[0]));
// 求二维数组列数
printf("j = %d\n", sizeof(a[0]) / sizeof(a[0][0]));
//求二维数组行*列总数
printf("n = %d\n", sizeof(a) / sizeof(a[0][0]));
return 0;
}
字符数组和字符串数组区别:
1.C语言中没有字符串这种数据类型,可以通过char的数组来替代;
2.字符串一定是一个char的数组,但char的数组未必是字符串;
3.数字0(和字符‘\0’等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以
字符串是一种特殊的char的数组。
#include <stdio.h>
int main()
{
char c1[] = { 'c', ' ', 'p', 'r', 'o', 'g' }; //普通字符数组
printf("c1 = %s\n", c1); //乱码,因为没有’\0’结束符
//以‘\0’(‘\0’就是数字0)结尾的字符数组是字符串
char c2[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0'};
printf("c2 = %s\n", c2);
//字符串处理以‘\0’(数字0)作为结束符,后面的'h', 'l', 'l', 'e', 'o'不会输出
char c3[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0', 'h', 'l', 'l', 'e', 'o', '\0'};
printf("c3 = %s\n", c3);
return 0;
}
#include <stdio.h>
// C语言没有字符串类型,通过字符数组模拟
// C语言字符串,以字符‘\0’, 数字0 结束
int main()
{
//不指定长度, 没有0结束符,有多少个元素就有多长
char buf[] = { 'a', 'b', 'c' };
printf("buf = %s\n", buf); //乱码
//指定长度,后面没有赋值的元素,自动补0
char buf2[100] = { 'a', 'b', 'c' };
printf("buf2 = %s\n", buf2);
//所有元素赋值为0
char buf3[100] = { 0 }; //输出之后是一排空
//char buf4[2] = { '1', '2', '3' };//数组越界
char buf5[50] = { '1', 'a', 'b', '0', '7' };
printf("buf5 = %s\n", buf5); 输出 1ab07
char buf6[50] = { '1', 'a', 'b', 0, '7' };
printf("buf6 = %s\n", buf6); 输出 1ab
char buf7[50] = { '1', 'a', 'b', '\0', '7' };
printf("buf7 = %s\n", buf7); 输出 1ab
//使用字符串初始化,编译器自动在后面补0,常用
char buf8[] = "agjdslgjlsdjg";
//'\0'后面最好不要连着数字,有可能几个数字连起来刚好是一个转义字符
//'\ddd'八进制字义字符,'\xdd'十六进制转移字符
// \012相当于\n
char str[] = "\012abc";
printf("str == %s\n", str);
return 0;
}
字符串输入
scanf的3种应用:
接收有限字符:
char ch1[] ;
char ch2[] ;
char ch3[]";
scanf("%1s%2s%3s",ch1,ch2,ch3);
接收空格:
scanf("%[^\n]",ch1);
接收有限数字:
int a,b,c;
scanf("%1d,%2d,%3d",&a,&b,&c);
char ch1[] ="abc";
接收不想接收的(用*屏蔽不想接收的)
int a;
sacnf("%*c%d",&a);
输入输出函数
1、gets(ch):可以接受空格,以换行符(\n)和文本结尾标志( ),自动把\n替换成\0结束输入。
2、fgets(ch,sizeof(ch),stdin):在文件中进行读写操作,也可以接收字符串
如果接收的字符串小于定义数组长度,在接收到\n结束时自动把\n作为字符串的一部分并且在其后面加上\0;
如果接收的字符串长度大于定义数组长度,默认接收最长长度并在末尾加上\0;
3、puts(" abcd");自动输出换行
4、printf();
5、fputs(ch,stdout);
函数调用产生随机数
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
time_t tm = time(NULL);//得到系统时间
srand((unsigned int)tm);//随机种子只需要设置一次即可
//srand((unsigned int)time(NULL));
int r = rand() % 100;//0 - 100
printf("r = %d\n", r);
return 0;
}