Linux下的C语言基础-2
控制语句:
条件判断:if、if else
循环语句:while
转向语句:break :跳出所有循环 执行循环后边的语句
continune:结束当前循环,不执行continune 后的语句。继续下一次循环
1.switch 开关语句
简化if语句的多层嵌套
2.for 循环语句
for(表达式1;表达式2;表达式3)
语句;
表达式1:循环变量赋初值,for(int a = 0;xxxx;xxxx;)
表达式2:循环条件,一般为关系表达式,或逻辑表达式
表达式3:修改循环变量的值,一般为赋值语句
3.数组:有一定顺序关系的相同数据类型的变量集合
数组属于构造类型
数组元素可以是基本数据类型或构造类型
数组可分为数值数组、字符数组、指针数组、结构体数组等
C语言中使用数组前必须先定义
<存储类型><数据类型><数组名>[<常量表达式>];
存储类型:auto register static extern
数据类型:数组元素的数据类型
数组名:数组标识符
常量表达式:数组元素的个数或数组的长度
数组初始化:
全部初始化---> int a[5] = {1,2,3,4,5};
部分初始化---> int a[10] = {1,2,3,4,5};其余的元素自动赋值为0
数组全部赋值---> int a[] = {1,2,3,4,5};全部赋值是可以省略下标常量的
编译器根据初始化列表统计我们的数组元素个数
数组全部初始化为0---> int a[10]={0};
数组内存的分配:
数组分配的是连续空间,根据单个元素所占空间进行分配
数组下标是从0开始的 如数组的常量表达式为n 则最后一个元素下标为 n-1
访问数组元素时不允许超出数组下标范围 很危险 访问越界
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p = a;
for(int i=0;i<10;i++){
printf("%d :%p\n",a[i],p++);
}
return 0;
}
练习:冒泡排序:
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[10]={99,22,33,55,77,11,66,44,88,111};
int i,j;
for(i=0;i<10;i++){
for(j=0;j<9-i;j++){
if(a[j]<a[j+1]){
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
for(i=0;i<10;i++){
printf("%d\n",a[i]);
}
return 0;
}
4.字符串
字符串是以‘\0’结尾的一串字符
C语言中没有专门的字符串变量
通常我们是用字符数组存放字符串,因此字符数组存放字符串也要把‘\0’放到数组中
且作为结尾标志
char c[]={'h','e','l','l','o','\0'};
char c[]={"hello"};
char c[]="hello";
用字符串要比用字符逐个赋值多占一个字节,用来存放‘\0’;
‘\0’是由编译器自动加上去的
char *s = "hello";
练习:求 指向字符串的 指针所占字节长度
字符串处理函数
考贝:#include <string.h>
char *strcpy(char *dest, const char *src);
功能:将src的字符串拷贝到dest里边
参数:src源字符串的起始地址,dest是目标起始地址
返回值:目标字符串的起始地址
注:‘\0’也会被拷贝
#include <stdio.h>
#include <string.h>
#define LEN 128
int main(int argc, const char *argv[])
{
char c[]="hello";
char s[LEN];
char *s1=NULL;
s1=strcpy(s,c);
printf("%s\n",s);
printf("s=%p\ns1=%p\n",s,s1);
return 0;
}
比较:int strcmp(const char *s1, const char *s2);
功能:按照ASCII码顺序比较s1、s2字符串
参数: s1和s2都是字符串的起始地址
返回值:s1 = s2 返回 ==0
s1 > s2 返回 >0
s1 < s2 返回 <0
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char *s = "hello";
char *s1 = "hello world";
int ret = strcmp(s1,s);
printf("ret = %d\n",ret);
if(ret == 0){
printf("s1==s2\n");
}
return 0;
}
求长:size_t strlen(const char *s);
功能:求字符串长度 不含‘\0’
参数: s 是字符串起始地址
返回值: 字符串长度
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char *s="hello world";
int ret = strlen(s);
printf("ret = %d\n",ret);
return 0;
}
5.指针
指针是一个变量,表示普通变量的地址,指针的内存字节宽度视操作系统而定。
32位操作系统4字节
64位操作系统8字节
int a;
int *p = &a;
*p==a
p==&a
&为普通变量取地址符,
*为指针变量存储的地址数据所存储的值
指针的定义:
类型说明 * 变量名
int *p;只能指向int类型的普通变量地址
char *s;只能指向char类型的普通变量地址
指针赋值:
指针使用前不仅要定义说明,而且要赋予具体的值
未经赋值的指针不能随便使用;
int i;
int *p;
p = &i;
********
int i,*p;
p=&i;
********
int i ,*p=&i;
指针常量:
指向一块区域,这块区域可读可写,但是指针初始化后不能改变
char *const p;
常量指针:
指向一块区域,这块区域只可读不可写。
const char *p;
野指针:
int *a;
*a = 52;
a是随机指向一个内存单元,这样的指针称为野指针。使用是不合法的
指针在间接使用之前一定要确保已经指向一个合法的对象
6.函数
7.结构体