数据类型

类型字节数说明
int4字节
float4字节形式->0.123 或 1.23e-1
double8字节双精度浮点型
char1字节与int类型可通用,printf(“%c\n”,c+32);–>a
字符串字符数+1字符串结尾\0字符不显示,用于判断字符串结束,因此+1

一个字节byte = 8 bit; 1 byte = 0000 0000

补充

类型32位(byte)64位(byte)
char11
short22
int44
long48
long long88
float44
double88

printf函数

printf函数的具体代码格式

写法含义
%c字符
%d带符号整数,-左对齐,不带右对齐(printf函数默认靠右对齐)
%x无符号十六进制数,用小写字母
%X无符号十六进制数,用大写字母
%f浮点数;%5.2f显示5位数字,并带有2位小数的浮点数
%s一串字符,%10s代表占用10个字符位置
%u无符号整数
%p一个指针

写法示例

1
printf("my name is %s, %d years old","why",20);

数组

数组的定义

1
2
3
4
5
6
7
//一维数组的定义格式
//类型说明符 数组名 [常量表达式];
int A[10];

//动态定义
int n;
int *A = (int *)malloc(sizeof(int)*n)

数组的初始化

数组初始化例子
(1)在定义数组时对数组元素赋初值。int a[10]={0,1,2,3,4,5,6,7,8,9};不能写成int a[10];a[10]={0,1,2,3,4,5,6,7,8,9}
(2)可以只给一部分元素赋值int a[10]={0,1,2,3,4};
(3)使一个数组中全部元素的值为 0,那么可以写为int a[10]={0,0,0,0,0,0,0,0,0,0};或int a[10]={0};
(4)在对全部数组元素赋初值时,数据的个数,可以不指定数组的长度int a[]={1,2,3,4,5};
  • 数组名a存的是数组的起始地址,数组名传递到子函数后,形参接收到的是数组起始地址
  • 指针在64为计算机上是8个字节
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    int k=10;
    int a[k]; -->//有的编译器支持,但是有的编译器不支持,尽量还是不要这样使用

    //另外不能直接给指针赋值一个数组
    int *data;
    data={1,2,3,4,5}; --> 错误

    int *data
    int arr[]={1,2,3,4,5};
    data=arr --> 正确

    //另外,数组名是一个常量指针,它指向数组第一个元素,无法被修改
    //如果要修改,需要定义一个指针变量
    int arr[]={1,2,3,4,5};
    arr++; -->错误

    int arr[]={1,2,3,4,5};
    int *data=arr;
    data++; -->正确

调试debug

进入子函数

  • 按向下箭头进入子函数
  • 按拐弯箭头越过子函数,只在当前函数一步一步走下去
    image.png

查看变量内存视图

  • 点击内存视图
  • 输入&i,i为要查看内存视图的变量
    image.png

指针

1
2
3
4
5
6
7
8
9
10
11
12
13
//* 在变量定义中的意思
int a=1;
int* pa = &a; //这里的*声明定义的p是指针,指向的是a的内存地址
int** p = &pa; //二级指针,** 声明该指针是 指针的指针

//* 在变量赋值运算中的意思
*pa == 1; //这里*是取值得意思 pa的值
*p == pa;
**p == *pa == 1;

//指针进行+运算


image.png

指针的写法注意要点

1
2
3
int *a,b; // *靠近a,定义的是一个int指针变量a ,和一个普通int型变量b

int* a,b // *靠近int,定义的两个指针类型变量a,b

C++中的引用

C语言中值传递,函数传递的参数只是将i赋值给j,并没有改变i的值

1
2
3
4
5
6
7
8
9
10
11
change(int j){
j++;
}

int main(){
int i =10;
printf("i=%d\n",i);//输出i=10
change(i);
printf("i=%d\n",i);//输出i=10

}

要想改变值,需要运用指针

1
2
3
4
5
6
7
8
9
10
11
12
change(int* j){ //j是int类型指针,int 
*j++; //这里* j表示对j取值,表示对j指向的地址所存的值进行修改
}

int main(){
int i =10;
printf("i=%d\n",i);//输出i=10
change(&i); //& 表示取地址,参数类型是指针,需要传入地址
printf("i=%d\n",i);//输出i=11

}

C++中的应用,s省去了C语言中需要修改变量的步骤

1
2
3
4
5
6
7
8
9
10
11
12
change(int &j){  //& 表示引用
j++; //能直接对j的值修改
}

int main(){
int i =10;
printf("i=%d\n",i);//输出i=10
change(i);
printf("i=%d\n",i);//输出i=11

}

struct结构体

定义结构体

这种方式定义的结构体,每次结构体声明都要struct student s;指针声明struct student *p*;

1
2
3
struct 结构体名{
[成员列表]
};

给定义的结构体重命名,结构体声明方式直接stu s;结构体指针pstu p;

1
2
3
4
5
6
7
8
typedef struct Student{//下面起了别名stu后student可以省略不写
[成员列表]
}stu,*pstu; //stu结构体别名;*pstu结构体指针别名


typedef struct {//下面起了别名stu后student可以省略不写
[成员列表]
}stu,*pstu; //stu结构体别名;*pstu结构体指针别名

结构体数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define MaxSize 100
typedef struct node{
int n;
double val;
}Stack[MaxSize];

//声明单独结构体
struct node x;
//声明结构体数组
Stack st; //最大容量MaxSize,无需手动分配空间,默认MaxSize
//声明结构体二维数组
Stack b[10]; //声明一个名为b的结构体数组的数组,包含10个结构体数组


typedef的使用

1
2
3
typedef int Element;//重命名int类型  Element i;
typedef int *p;//重命名指针类型 p k;
trpedef struct student stu;//如上,重命名结构体类型 stu s;

结构体指针意义

结构体指针的主要目的之一是为了在函数之间传递结构体而不复制整个结构体的内容。通过传递指针,你可以在函数内部修改结构体的值,而不需要操作结构体的副本。

通过结构体名引用和结构体指针引用都可以修改结构体的内容。然而,有一些区别:

  1. 语法差异:使用结构体名时直接使用 . 操作符,而使用结构体指针时使用 -> 操作符。

  2. 可读性和代码风格:在某些情况下,直接使用结构体名可能更清晰,尤其是当你知道你操作的是一个具体的结构体对象时。而使用指针可能更适用于需要传递结构体的地址或在函数中修改结构体的情况。

  3. 空指针检查:如果结构体指针是空指针(nullptr),对其进行操作可能导致未定义的行为。因此,在使用结构体指针之前,你需要确保它不是空指针。