c 语言初阶

这篇博客详细介绍了C语言的基本概念,包括数据类型、数组、字符串、指针、函数、结构体、枚举等内容。强调了指针在数组、函数及多维数组中的应用,以及字符串的初始化、操作和比较。此外,还讨论了main()函数的参数和返回值,以及类型重命名的typedef用法。
摘要由CSDN通过智能技术生成

文章目录

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];
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值