c语言(一)-数据类型 、指针、数组

270 阅读4分钟

本篇文章主要记录下c语言的语法、注意点、难点等。

c语言比较偏底层,怎么理解呢,其实就是因为指针的存在,指针就是内存的地址,c语言可以很灵活的通过指针操作内存,因此可以说偏底层。

数据类型

int float double char 数组 指针(一级、二级、多级、数组指针、函数指针等)struct union enum

  • int float double 这个没什么可说的,需要知道的是计算机在内存中二进制存储是通过补码来表示的,通过补码来进行四则运算。

    计算机为什么用补码呢?其为了解决+0 -0的问题

  • char:类型占一个字节,c语言中没有string字符串类型,一般通过char[]数组,或是char*指针来表示字符串,在内存在表示是数组形式,也就是一段连续的内存,同时以'\0'作为结尾

  • 数组 数组主要常用一维数组和二维数组。因为在定义数组的时候,编译器需要知道因为为数组分配多大的内存,所以在定义的时候就得让编译器知道大小

//一维数组
int a[10];
//二维数组 2个包含10个元素的一维数组
int b[2][10];
//指针数组,[]与*优先级相同,从右向左结合,所以是指针数据
char *c[10];
//数组指针,指针指向数组,怎么看是数组指针还是指针数组呢?()的优先级要比[]高,所以这个是指针
char (*d)[];
//函数指针,可以做回调函数来用
char (*e)(int)

注意点:当数组作为参数传递给函数形式参数的时候,会退化为指针

重点:一维数组的数组名表示首元素的地址 二维数组的数组名表示首行地址,区别是指针的步长不同,指针和数组在用法上可以相互转换使用,也即[]和*基本等价。编译器内部也会将[]转化成*来使用

  • 指针变量就是地址,通过*运算符可以操作指针所指向的内存。与之相关还有个取地址运算符&
//定义变量a
int a = 10;
//定义指针,通过取地址运算符,取得a的地址,把这个地址赋值指针变量
int *p = &a;
//通过*运算符操作p指针指向的内存,此时a的值变为了4
*p = 4;
  • struct 结构体 这个在c中是很重要的
//定义一个结构体
struct Student
{
    char *name;
    int age;
}

//声明一个结构体变量, struct Student一起才表示类型
struct Student student1;
struct Student *student2 = &student1;

//操作结构体有两种方式,通过结构体变量 结构体指针变量
//结构体变量通过“.”操作符
student1.name = "alex";

//结构体指针通过“->”操作符来操作
student2->name = "zhang";

注意:结构体变量和其他普通变量本质上没有去边,可以完全当作普通的类型来使用,struct Student一起才标志Student结构体类型

一般结构体类型会和typedef一起来使用

//定义一个新的类型Student,它是一个结构体
typedef struct Student
{
    char *name;
    int age;
}

//可以向普通的类型一样来使用了,这样就不用每次都带着struct了
Student student1;
Student *student2 = &student1;
  • union enum一般用的比较少

  • 指针 指针在c中是最重要的。指针变量也是一个变量,变量是什么呢?变量就是一块内存的名字,指针变量存储的内容是内存地址,可以通过*运算符来操作这个地址所指向的内存

    各种数据类型都有指针,整形指针,数组指针,函数指针,结构体指针,因为他们在内存中都有地址,所以都可以用指针来存储他们的地址

//字符指针,一般用来表示字符串
char *a;
//指针数组
char *b[];
//数组指针
char (*c)[];
//函数指针
char (*d)(int);

重点:指针步长,指针步长是什么呢?举个例子:

//定义一个字符指针
char *a;
//(a + 1)地址变化了1,因为a是指向char类型的内存,char在内存中用1一个字节表示

//定义一个整形指针
int *b;
//(b + 1)地址变化了4,因为b是指向int类型的内存,int在内存中用四个字节表示

//这个就是指针步长

程序控制流程

基本所有的程序设计语言都类型,if switch for while do-while等

只说下注意点:

  • switch 只能比较整形,char也是整形
  • continue和break continue跳出本次循环 break跳出整个循环