C语言基础入门2有哪些难点和技巧?

2026-04-10 09:182阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计3920个文字,预计阅读时间需要16分钟。

C语言基础入门2有哪些难点和技巧?

一、数组+1、概述+数组,所谓数组,就是一个集合,其中存放相同类型的数据元素。特点:

1、数组中的每个数据元素都是相同的数据类型。

2、数组是由连续的内存位置组成的。

一、数组

1、概述

所谓数组,就是一个集合,里面存放相同类型的数据元素

特点:

1、数组中的每个数据元素都是相同的数据类型

2、数组是由连续的内存位置组成的

2、一维数组

(1)、定义方式:

一维数组有中定义方式:

1、数据类型 数组名[数据长度];

2、数据类型 数组名[数据长度] = {值1,值2.....};

3、数据类型 数组名[] = {值1,值2......};

示例:

int main() { //一维数组定义 //方式1 int arr[5] = {0}; //方式2 int arr1[5] = { 1,2,3,4,5 }; //方式3 int arr2[] = { 6,7,8,9,0 }; cout << "数组1:"; for (int i = 0; i < 5; i++) { cout << arr1[i] ; } cout << "\n数组2:"; for (int i = 0; i < 5; i++) { cout << arr2[i]; } cout << "\n"; system("pause"); return 0; }


(2)、数组名:

用途:

1、用来统计整个数组在内存中的长度

2、可以获取数组在内存中的首地址


示例:


练习案例:

1、五只小猪称体重

案例描述:

在一个数组中记录了五只小猪的体重,如:int arr[5] = {300,350,200,400,250};找出并打印最重的小猪体重

代码示例:

int main() { //五只小猪称体重 int weight = 0; int arr[5] = { 12,34,56,78,43 }; for (int i = 0; i < (sizeof(arr) / sizeof(arr[0]));i++) { if (weight < arr[i]) { weight = arr[i]; cout << "当前最重小猪:" << weight << endl; } } cout << "最重小猪:" << weight << endl; system("pause"); }

执行效果:


2、数组元素逆置

案例描述:

请声明一个5个元素的数组,并且将元素逆置.

(如原数组元素为:1,3,2,5,4;逆置后输出结果为:4,5,2,3,1);

代码示例:

int main() { int arr[5] = { 1,2,3,4,5 }; int tmp = 0; int length = sizeof(arr) / sizeof(arr[0]); //打印逆置前 cout << "逆置前:"; for (int j = 0; j < length;j++) { cout << arr[j]<<" "; } cout << "\n"; //逆置 for (int i = 0;i<(length / 2);i++) { tmp = arr[i]; arr[i] = arr[length - i-1]; arr[length - i-1] = tmp; } //打印逆置后 cout << "逆置后:"; for (int k = 0; k < length; k++) { cout << arr[k] << " "; } cout << "\n"; system("pause"); return 0; }

执行效果:


(3)、冒泡排序

作用:最常用的排序算法,对数组内元素进行排序

1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2、对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。

3、重复以上的步骤,每次比较次数-1,直到不需要比较

示例: 将数组 { 4,2,8,0,5,7,1,3,9 } 进行升序排序

代码示例:

int main() { //40/4 = 10 int arr[] = { 4,2,8,0,5,7,1,3,9 }; int length = sizeof(arr) / sizeof(0); int tmp = 0; //排序前 cout << "排序前"; for (int k = 0; k < length; k++) { cout << arr[k]; } cout << "\n"; //排序 for (int j = 0; j < length;j++) { for (int i = 0; i < length-1; i++) { if (arr[i] > arr[i + 1]) { tmp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = tmp; } } } //排序后 cout << "排序后"; for (int k = 0; k < length;k++) { cout << arr[k]; } cout << "\n"; system("pause"); return 0; }

执行效果:


3、二维数组

(1)、二维数组的四种定义方式:

1、数据类型 数组名 [行数][列数];

2、数据类型 数组名 [行数][列数] = {{数据1 ,数据2},{数据3,数据4}};

3、数据类型 数组名 [行数][列数] = {数据1,数据2,数据3,数据4};

4、数据类型 数组名 [ ][列数] = {数据1,数据2,数据3,数据4};

建议:以上四种方式,第二种最直观,提高代码的可读性

示例:


(2)、二维数组数组名

作用:

1、查看二维数组所在空间

2、获取二维数组的首地址

示例:


总结:

1、二维数组名就是这个数组的首地址

2:对二维数组名进行sizeof时,可以获取整个二维数组占用的内存空间大小

3、二维数组可以看成是两个一维数组嵌套

二、函数

作用:将一段经常使用的代码封装起来,减少重复的代码

一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能

C语言基础入门2有哪些难点和技巧?

2、函数的定义

函数的定义一般主要有5个步骤:

1、返回值类型

2、函数名

3、参数列表

4、函数体语句

5、return表达式

语法:

返回值的类型 函数名 (参数列表){

函数体语句

return 表达式

}

示例:


3、函数的调用

功能:使用定义好的函数

语法:函数名(参数)

示例:


4、值传递

所谓值传递,就是函数调用时,实参将数值传入给形参

值传递时,如果形参发生改变,并不会影响实参

5、函数的常见形式

常见的函数样式有四种

1、无参无反

2、有参无反

3、无参有反

4、有参有反

示例:

void test1() { cout<<"这是无参无反函数"<<endl; } int test2() { cout << "这是无参有反函数" << endl; return 1; } void test3(int a) { cout << "这是有参无反函数:"<<a << endl; } int test4(int x) { cout << "这是有参有反函数:" <<x<< endl; return x; } int main() { //无参无反 test1(); //无参有反 test2(); //有参无反 int a = 10; test3(10); //有参有反 int x = 20; test4(x); }


6、函数的声明

作用:告诉编译器函数名称以及如何调用函数,函数的实际主体可以单独定义

语法:数据类型 函数名(参数列表);

注:函数的声明可以多次,但函数的定义只能有一次

示例:


7、函数的分文件编写

作用:让代码结构更加清晰

函数分文件编写一般分为4个步骤:

1、创建一个.h的头文件

2、创建后缀名为.cpp的源文件、

3、在头文件中写函数声明

4、在源文件中写函数的定义

示例:


三、指针

1、指针的基本概念

指针的作用:可以通过指针间接访问内存

注意事项:

1、内存编号是从0开始记录的,一般使用十六进制的数字表示

2、可以利用指针变量保存地址

2、指针变量的定义和使用

指针变量定义语法:数据类型* 指针变量名;

示例:

int main() { //指针定义 int a = 10; int* p = &a; cout << "a的地址:" << &a << endl; cout << "p的地址:" << p << endl; //指针使用 cout << "存放在p地址的值:" << *p << endl; }


3、指针所占的内存空间

提问:指针也是一种数据类型,那么这种数据类型占用多少内存空间?

答:在32位操作系统,占用4个字节,64位,占8个字节

示例:


4、空指针和野指针

空指针:指针变量指向的内存是编号为0的空间

用途:初始化指针变量

注意:空指针指向的内存是不可以访问的

示例:


野指针:指针变量指向一个非法的内存空间(指向未知内存空间)

示例:


5、const修饰指针

const修饰指针有三种情况:

1、Const修饰指针 --常量指针(指向常量的指针)

2、Const修饰常量 --指针常量(指针是常量)

3、Const即修饰指针,有修饰常量(指针和值都不可修改)


6、指针和数组

作用:利用指针访问数组中的元素

示例:

//指针和数组 int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,0 }; int* p = arr; for (int i = 0; i < 10;i++) { cout << "第" << i << "个数组元素的值是:" << *p<<endl; p++; } }


7、指针和函数

作用:利用指针做函数参数,可以修改实参的值,即地址传值

示例:

void swap(int* a,int* b) { int temp = 0; temp = *a; *a = *b; *b = temp; } //指针和函数 int main() { //地址传值 int a = 10; int b = 20; cout <<"调用前" <<a << " " << b<<endl; swap(&a,&b); cout << "调用后" << a<<" " << b; }


四、结构体

1、结构体的基本概念

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型

2、结构体的定义和使用

语法:struct 结构体名{结构体成员列表};

通过结构体创建变量的方式有三种:

1、struct 结构体名 变量名

2、struct 结构体名 变量名 = {成员1值,成员2值......}

3、定义结构体的时候顺便创建变量

示例:

int main() { //三种变量定义方式 //1、 struct student s1; s1.name = "zhangsan"; s1.age = 18; s1.score = 100; cout << "学生:" << s1.age << "年龄:" << s1.age << "成绩:" << s1.score << endl; //2、 student s2 = { "lisi",19,101 }; cout << "学生:" << s2.age << "年龄:" << s2.age << "成绩:" << s2.score << endl; //3、 s3.name = "laoliu"; s3.age = 20; s3.score = 102; cout << "学生:" << s3.age << "年龄:" << s3.age << "成绩:" << s3.score << endl; system("pause"); return 0; }


注意:

在C++中,创建变量时,struct关键字可以省略

3、结构体数组

作用:将自定义的结构体放入到数组中,方便维护

语法:struct 结构体名 数组名[元素个数] = { {} ,{}...}

示例:


4、结构体指针

作用:通过指针访问结构体中的成员

利用操作符->,可以通过结构体指针访问结构体属性

语法:指针名->属性

示例:


5、结构体嵌套结构体

作用:结构体中的成员可以是另一个结构体

例如:每一个老师辅导学员,一个老师的结构体中,记录一个学生的结构体

示例:


6、结构体做函数参数

作用:将结构体作为参数向函数传递

传递方式有两种:

1、值传递

2、地址传递

示例:


7、结构体中const使用场景

作用:用const来防止误操作(常量指针)

示例:



本文共计3920个文字,预计阅读时间需要16分钟。

C语言基础入门2有哪些难点和技巧?

一、数组+1、概述+数组,所谓数组,就是一个集合,其中存放相同类型的数据元素。特点:

1、数组中的每个数据元素都是相同的数据类型。

2、数组是由连续的内存位置组成的。

一、数组

1、概述

所谓数组,就是一个集合,里面存放相同类型的数据元素

特点:

1、数组中的每个数据元素都是相同的数据类型

2、数组是由连续的内存位置组成的

2、一维数组

(1)、定义方式:

一维数组有中定义方式:

1、数据类型 数组名[数据长度];

2、数据类型 数组名[数据长度] = {值1,值2.....};

3、数据类型 数组名[] = {值1,值2......};

示例:

int main() { //一维数组定义 //方式1 int arr[5] = {0}; //方式2 int arr1[5] = { 1,2,3,4,5 }; //方式3 int arr2[] = { 6,7,8,9,0 }; cout << "数组1:"; for (int i = 0; i < 5; i++) { cout << arr1[i] ; } cout << "\n数组2:"; for (int i = 0; i < 5; i++) { cout << arr2[i]; } cout << "\n"; system("pause"); return 0; }


(2)、数组名:

用途:

1、用来统计整个数组在内存中的长度

2、可以获取数组在内存中的首地址


示例:


练习案例:

1、五只小猪称体重

案例描述:

在一个数组中记录了五只小猪的体重,如:int arr[5] = {300,350,200,400,250};找出并打印最重的小猪体重

代码示例:

int main() { //五只小猪称体重 int weight = 0; int arr[5] = { 12,34,56,78,43 }; for (int i = 0; i < (sizeof(arr) / sizeof(arr[0]));i++) { if (weight < arr[i]) { weight = arr[i]; cout << "当前最重小猪:" << weight << endl; } } cout << "最重小猪:" << weight << endl; system("pause"); }

执行效果:


2、数组元素逆置

案例描述:

请声明一个5个元素的数组,并且将元素逆置.

(如原数组元素为:1,3,2,5,4;逆置后输出结果为:4,5,2,3,1);

代码示例:

int main() { int arr[5] = { 1,2,3,4,5 }; int tmp = 0; int length = sizeof(arr) / sizeof(arr[0]); //打印逆置前 cout << "逆置前:"; for (int j = 0; j < length;j++) { cout << arr[j]<<" "; } cout << "\n"; //逆置 for (int i = 0;i<(length / 2);i++) { tmp = arr[i]; arr[i] = arr[length - i-1]; arr[length - i-1] = tmp; } //打印逆置后 cout << "逆置后:"; for (int k = 0; k < length; k++) { cout << arr[k] << " "; } cout << "\n"; system("pause"); return 0; }

执行效果:


(3)、冒泡排序

作用:最常用的排序算法,对数组内元素进行排序

1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2、对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。

3、重复以上的步骤,每次比较次数-1,直到不需要比较

示例: 将数组 { 4,2,8,0,5,7,1,3,9 } 进行升序排序

代码示例:

int main() { //40/4 = 10 int arr[] = { 4,2,8,0,5,7,1,3,9 }; int length = sizeof(arr) / sizeof(0); int tmp = 0; //排序前 cout << "排序前"; for (int k = 0; k < length; k++) { cout << arr[k]; } cout << "\n"; //排序 for (int j = 0; j < length;j++) { for (int i = 0; i < length-1; i++) { if (arr[i] > arr[i + 1]) { tmp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = tmp; } } } //排序后 cout << "排序后"; for (int k = 0; k < length;k++) { cout << arr[k]; } cout << "\n"; system("pause"); return 0; }

执行效果:


3、二维数组

(1)、二维数组的四种定义方式:

1、数据类型 数组名 [行数][列数];

2、数据类型 数组名 [行数][列数] = {{数据1 ,数据2},{数据3,数据4}};

3、数据类型 数组名 [行数][列数] = {数据1,数据2,数据3,数据4};

4、数据类型 数组名 [ ][列数] = {数据1,数据2,数据3,数据4};

建议:以上四种方式,第二种最直观,提高代码的可读性

示例:


(2)、二维数组数组名

作用:

1、查看二维数组所在空间

2、获取二维数组的首地址

示例:


总结:

1、二维数组名就是这个数组的首地址

2:对二维数组名进行sizeof时,可以获取整个二维数组占用的内存空间大小

3、二维数组可以看成是两个一维数组嵌套

二、函数

作用:将一段经常使用的代码封装起来,减少重复的代码

一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能

C语言基础入门2有哪些难点和技巧?

2、函数的定义

函数的定义一般主要有5个步骤:

1、返回值类型

2、函数名

3、参数列表

4、函数体语句

5、return表达式

语法:

返回值的类型 函数名 (参数列表){

函数体语句

return 表达式

}

示例:


3、函数的调用

功能:使用定义好的函数

语法:函数名(参数)

示例:


4、值传递

所谓值传递,就是函数调用时,实参将数值传入给形参

值传递时,如果形参发生改变,并不会影响实参

5、函数的常见形式

常见的函数样式有四种

1、无参无反

2、有参无反

3、无参有反

4、有参有反

示例:

void test1() { cout<<"这是无参无反函数"<<endl; } int test2() { cout << "这是无参有反函数" << endl; return 1; } void test3(int a) { cout << "这是有参无反函数:"<<a << endl; } int test4(int x) { cout << "这是有参有反函数:" <<x<< endl; return x; } int main() { //无参无反 test1(); //无参有反 test2(); //有参无反 int a = 10; test3(10); //有参有反 int x = 20; test4(x); }


6、函数的声明

作用:告诉编译器函数名称以及如何调用函数,函数的实际主体可以单独定义

语法:数据类型 函数名(参数列表);

注:函数的声明可以多次,但函数的定义只能有一次

示例:


7、函数的分文件编写

作用:让代码结构更加清晰

函数分文件编写一般分为4个步骤:

1、创建一个.h的头文件

2、创建后缀名为.cpp的源文件、

3、在头文件中写函数声明

4、在源文件中写函数的定义

示例:


三、指针

1、指针的基本概念

指针的作用:可以通过指针间接访问内存

注意事项:

1、内存编号是从0开始记录的,一般使用十六进制的数字表示

2、可以利用指针变量保存地址

2、指针变量的定义和使用

指针变量定义语法:数据类型* 指针变量名;

示例:

int main() { //指针定义 int a = 10; int* p = &a; cout << "a的地址:" << &a << endl; cout << "p的地址:" << p << endl; //指针使用 cout << "存放在p地址的值:" << *p << endl; }


3、指针所占的内存空间

提问:指针也是一种数据类型,那么这种数据类型占用多少内存空间?

答:在32位操作系统,占用4个字节,64位,占8个字节

示例:


4、空指针和野指针

空指针:指针变量指向的内存是编号为0的空间

用途:初始化指针变量

注意:空指针指向的内存是不可以访问的

示例:


野指针:指针变量指向一个非法的内存空间(指向未知内存空间)

示例:


5、const修饰指针

const修饰指针有三种情况:

1、Const修饰指针 --常量指针(指向常量的指针)

2、Const修饰常量 --指针常量(指针是常量)

3、Const即修饰指针,有修饰常量(指针和值都不可修改)


6、指针和数组

作用:利用指针访问数组中的元素

示例:

//指针和数组 int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,0 }; int* p = arr; for (int i = 0; i < 10;i++) { cout << "第" << i << "个数组元素的值是:" << *p<<endl; p++; } }


7、指针和函数

作用:利用指针做函数参数,可以修改实参的值,即地址传值

示例:

void swap(int* a,int* b) { int temp = 0; temp = *a; *a = *b; *b = temp; } //指针和函数 int main() { //地址传值 int a = 10; int b = 20; cout <<"调用前" <<a << " " << b<<endl; swap(&a,&b); cout << "调用后" << a<<" " << b; }


四、结构体

1、结构体的基本概念

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型

2、结构体的定义和使用

语法:struct 结构体名{结构体成员列表};

通过结构体创建变量的方式有三种:

1、struct 结构体名 变量名

2、struct 结构体名 变量名 = {成员1值,成员2值......}

3、定义结构体的时候顺便创建变量

示例:

int main() { //三种变量定义方式 //1、 struct student s1; s1.name = "zhangsan"; s1.age = 18; s1.score = 100; cout << "学生:" << s1.age << "年龄:" << s1.age << "成绩:" << s1.score << endl; //2、 student s2 = { "lisi",19,101 }; cout << "学生:" << s2.age << "年龄:" << s2.age << "成绩:" << s2.score << endl; //3、 s3.name = "laoliu"; s3.age = 20; s3.score = 102; cout << "学生:" << s3.age << "年龄:" << s3.age << "成绩:" << s3.score << endl; system("pause"); return 0; }


注意:

在C++中,创建变量时,struct关键字可以省略

3、结构体数组

作用:将自定义的结构体放入到数组中,方便维护

语法:struct 结构体名 数组名[元素个数] = { {} ,{}...}

示例:


4、结构体指针

作用:通过指针访问结构体中的成员

利用操作符->,可以通过结构体指针访问结构体属性

语法:指针名->属性

示例:


5、结构体嵌套结构体

作用:结构体中的成员可以是另一个结构体

例如:每一个老师辅导学员,一个老师的结构体中,记录一个学生的结构体

示例:


6、结构体做函数参数

作用:将结构体作为参数向函数传递

传递方式有两种:

1、值传递

2、地址传递

示例:


7、结构体中const使用场景

作用:用const来防止误操作(常量指针)

示例: