文章目录
c语言初阶
1基本数据类型
在C语言中,除了有无符号关键字unsigned,还对应有一个有符号关键字signed,只是通常省略不写。此外,除了char,其他整型类型后面可以加上关键字int表示整型,通常也是省略不写。下面是各种类型其他对应写法。
1.1整数常量后缀
没有后缀的整数常量默认为int,只能表示21亿左右的数值,如果超过就会警告,执行就会出错,因为int无法表示超出的数字。
后缀基本为类型第一个字符的大小写
如:L/l与U/u组合 unsigned long
1.2浮点数常量后缀
没有后缀的浮点数默认为double。
后缀、 | 类型 |
---|---|
F/f | long double |
F/f | float |
1.3科学记数法
表示方式:尾数部分e指数部分或者尾数部分E指数部分
使用科学计数法表示数字更加简单。
2数组
2.1初始化
2.1.1整体初始化
代码 | 结论 |
---|---|
int arr[12]; | 1. 数组未初始化,数组里面的值都是随机值 |
int arr[12] = {0}; | 2. 数组初始化为{0},数组里面的值都是0。 |
int arr[12] = {2}; | 3. 数组初始化为{非零值},数组里面第一个值是非零值,其他的值都是0。 |
2.1.2部分初始化
代码 | 结论 |
---|---|
int arr[12] = {[2]=2,[5]=5}; | 指定下标的值被赋值,其他的值都是0。这是C99语法。 |
2.1.3大小
数组大小=元素大小*数组个数。
char carr[12];
int iarr[12];
double farr[12];
printf("carr = %d\n",sizeof(carr));
printf("iarr = %d\n",sizeof(iarr));
printf("farr = %d\n",sizeof(farr));
结果
carr = 12
iarr = 48
farr = 96//12*8
注意
int days[]={
31,28,31,30,31,30,31,31,30,31,30,31};
int arr = days;
警告
douhao.c:24:11: 警告:初始化将指针赋给整数,未作类型转换 [默认启用]
int arr = days;
printf("days[0]=%p\n",&days[0]);
printf("days=%p\n",days);
printf("arr=%d\n",arr);
结果
days[0]=0x7ffeb293c000
days=0x7ffeb293c000
arr=-1298939904
结论
????????????????
2.2数组与指针
1数组名是数组第一个元素的地址。
数组下标实现的操作指针也可以实现 。
arr+i == &arr[i]
*(arr+i) = arr[i]
int arr[] = {
1,2,3,4,5,6,7,8};
for(int i=0;i<8;++i){
printf("%d\n",*(arr+i)); //arr数组首元素首地址 + i等于arr[i]的地址 然后*解引用,最后等于arr[i] 的值
}
2.3函数与数组
2.3.1 传递数组给函数
数组作为函数参数时,通常必须再用一个参数传入数组大小
返回值类型 函数名(类型 参数名[],int size){
}
返回值类型 函数名(类型* 参数名,int size){
}
注意
数组作为参数时,数组退化成指针,不能利用sizeof获取数组大小,也就不能计算数组元素个数。
2.3.2 从函数返回数组
C 语言不允许返回一个完整的数组作为函数的参数。通过指定不带索引的数组名来返回一个指向数组的指针。
return arr//数组名
int arr[] = {
1,2,3,4,5,6};
// sizeof(数组名)=类型大小乘数量
printf("sizeof(arr) = %ld\n",sizeof(arr));
// 数组名的值
printf("arr=%p\n&arr[0]=%p\n",arr,&arr[0]);
结果
sizeof(arr) = 24///注意
arr=0x7fff840bef30
&arr[0]=0x7fff840bef30
2.4 多维数组:
多维数组初始化只能第一个维度可以省略。
2.4.1二维数组
2.4.1.1初始化
2.4.1.1.1分行进行初始化
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9}};
2.4.1.1.2不分行对数组初始化
int arr[2][2] = {1,2,3,4};赋值时即为逐个赋值(先行后列)。
2.4.1.1.3为部分数组元素初始化
static int arrr[2][3] = { {1,2},{3}};第一行只赋值给前两个,第二行只赋值给第一个。这是存储类型是static,故其他未赋值的数组元素的初值为0
2.4.1.1.4省略数组第一维定义,但第二维不可省略。系统会根据给出的初始化数据个数和第二维长度
确定第一维的长度
int arr[][2] = {1,2,3,4}即可等价于 int arr[2][2] = {
{1,2},{3,4}}
二维i数组不能整体赋值;
注意 不是所有的C语言系统中存储类型不是static的变量或数组的初值也是0.
2.5const数组
数组变量已经是const指针,表示数组中的每一个元素都是const int,即每个元素不能通过arr改变。
保护数组值
2.5.1作用
因为数组作为函数参数是以地址方式传递的,所以函数内部可以修改数组的值。
为了保护数组不被函数破坏,可设置参数为const。
例如:
int sum(const int arr[],int len);
或者
int sum(const int* arr,int len);
2.6返回值含义
返回值的含义以及值是人为定义的。
返回值有时存在两种情况:合法值和非法值。
如果有非法值的情况,通常使用一些特定的值指代特殊情况。例如:数组下标只能是0和正数。我们实现数组查找元素下标时,存在找不到元素的情况,这时,使用-1可以作为这种情况的返回值。
2.7二维数组指针用法
目标 | 从下标中的值 | 从指针中的值 |
---|---|---|
第i行第j列元素值 | arr[i][j] | ((arr+i)+j) |
第i行第j列元素地址 | &arr[i][j] | *(arr+i)+j |
在二维数组中a[i]就是一个一维数组。
3字符串
3.1. 字符串操作
3.1.1 字符串遍历
1:可以通过数组方式遍历字符串。
char* str="Hello World";
for(int i = 0;'\0' != str[i];++i){
printf("%c\n",str[i]);
}
2:也可以使用指针方式
char* str="Hello World";
for(int i = 0;'\0' != *str;++i){
printf("%c\n",*(str+i));
}
2.1:指针方式可以简化成
char* str="Hello World";
for(;'\0' != *str;++str){
printf("%c\n",*str);
}
2.2:甚至是字符串名
while('\0' != *str){
printf("%c\n",*str++);
}
3.1.2 字符串赋值
char* s = "Hello World";
char* t;
t = s;//没有产生新的字符串,只是s和t指向相同的字符串。下面是查看两个字符串的地址。
printf("%s\n",t);
printf("%p\n",s);
printf("%p\n",t);
结果:
Hello World
0x4007f8
0x4007f8
3.1.3 字符串输入输出
char str[8];