前面的基础教程已经更新结束了,主要以基础语法为主。然后我在这里开启了第二章的教程。一般打比赛的话也用不上这后面的内容。
一、指针
1、入门与了解
什么是指针我们可以这么理解:变量是房间,赋值变量的值是住户,房间门牌号是指针。
示例代码:
#include <stdio.h>
int main()
{
int a = 100;
int* p = &a;
printf("%d\n", *p);
return 0;
}
* 你可以理解成一个标记,但是要注意的是 p要和a的变量类型要保持一致。代码中定义了个指针p来指向a,然后通过指针从变量中获取了 a = 100 这个数据。当然你也可以使用指针来修改变量的数据:
*p =200;
2、作用
①数据交换
示例代码:
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
printf("调用前数据为:%d %d\n",a,b);
swap(&a,&b);
printf("调用后数据为:%d %d\n",a,b);
return 0;
}
void swap(int *p1,int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
我们先定义了 a b 两个变量然后在外置设置了 swap来进行交换两组数据,但是不同的是我们把 void swap 中的变量改成了指针,和我前面说的作用中的 int* p = &a; 同一个数据。在 swap 中我们进行了 a b 两个数据的交换后返回到 main 中输出。
②输出多个函数
我前面的内容也有讲过这个类型的东西,相信大家都能理解这个代码:
#include <stdio.h>
void MaxAndMin(int arr[],int len, int* max,int* min);
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int len = sizeof(arr) / sizeof(int);
int max = arr[0];
int min = arr[0];
MaxAndMin(arr,len,&max,&min);
printf("数组的最大值是:%d\n",max);
printf("数组的最小值是:%d\n",min);
}
void MaxAndMin(int arr[],int len, int* max,int* min)
{
*max = arr[0];
for (int i=0;i < len; i++)
{
if (arr[i] > *max)
{
*max = arr[i];
}
}
for (int i=0;i < len; i++)
{
if (arr[i] < *min)
{
*min = arr[i];
}
}
}
相信大家应该对这个东西不默认,还是一样的 *max 这个指针指向了max这个变量 所以可以使指针可以输出,然后剩下的就不多说了。我也不知道要怎么解释,不过前面的内容和这个有点相似就是了!
③指针取余数
指针如何取余数,让我们看以下代码:
#include <stdio.h>
int PrintRemainer(int num,int num1,int* res);
int main()
{
int num = 10;
int num1 = 3;
int res;
int flag = PrintRemainer(num,num1,&res);
if (!flag)
{
printf("取到的余数为:%d",res);
}
return 0;
}
int PrintRemainer(int num,int num1,int* res)
{
if(num1==0)
{
return 1;
}
*res = num % num1;
return 0;
}
还是和上面一样 但是我稍微讲解以下 PrintRemainer 这一个部分,判断除数是否为 0,当除数为0的时候返回值为1则程序停止,如果除数不是0的话将返回0这个结果。而if条件语句中判断 !flag 就是当收到返回值为0的时候 !flag 为真,则会输出以下结果:printf(“取到的余数为:%d”,res);
二、结构体
1、基础入门以应用
①入门及了解
什么叫做结构体呢?看黑马程序员的例子:
看着话其实就像一个登记表一样,一个登记表里面有姓名、年龄、性别和身高,那么登记表的所采集的数据都是一样的,只是每个人所等级的数据是不一样的,那么你可以想象登记表就是结构体。
②结构体的格式
所以接下来就是交给大家如何应用结构体:
struct InputTable
{
char name[50];
int age;
};
首先的话这是结构体的一个固定的格式,其中呢 struct 就是声明它是一个结构体,InputTable就是一个结构体的姓名。那里面的内容呢?那就是登记表的内容嘛,姓名啊 年龄啊,是吧都可以填。
另外的话就是有一个小细节大家可以注意一下,就是结构体到底是要在main里面还是main外面呢?其实的话两个地方都可以存在,但是所代表的含义都不一样:
在内的话就是相当于局部变量 只能用作于一个main中,而在main外的话就是全局变量这样的话大家都可以用。
③结构体的定义和引用
如何进行定义数据并且说应用呢?比如说输出啊什么的,看示例代码:
struct InputTable test;
test.age = 10;
strcpy(test.name, "John");
首先的话,第一行代码讲结构体InputTable用test来代替,后面的话定义InputTable就是用test来表示,后面的代码大家应该也是可以看懂,其实把它当一整块变量就可以了。包括输出也是一样:
printf("%s\n", test.name);
然后总结:
2、结构体数组的应用
前面的话登记表的记录年龄一条,姓名一条,一个一个录是不是有点麻烦,现在的话是可以直接同时赋值进行写入数据的,看示例代码:
struct InputTable test = {"Hello World!", 5};
这样的话,登记表中的test就是同时被赋予了姓名和年龄,那如何讲多名学生塞入同一个登记表呢?看示例代码:
struct InputTable st1 = {"Hello World!", 5};
struct InputTable st2 = {"Hello World!", 6};
struct InputTable st3 = {"Hello World!", 7};
struct InputTable stu[3] = {st1, st2, st3};
示例代码中直接将 st1、st2、st3三名学生直接塞进了 stu[3] 这个数组中。
3、起别名
起别名是什么?直接看黑马程序员的一个解释:
起别名相较于前面比较初始的结构体会方便很多,方便在哪里?就是在赋值的部分中,看示例代码:
typedef struct
{
char name[20];
int age;
} Student;
int main()
{
Student st1 = {"John", 20};
printf("%s\n", st1.name);
}
看到了嘛,如果说直接用起别名的话是不需要和前面结构体那样定义,就设置别名 Student 后面的话每一名学生就是按照格式那样子,比如说学生 st1 ,直接进行赋值即可。同时数组的话也是一样方便:
Student arr[3] = {st1,st2,st3};
4、结构体作为函数的参数进行传参
对的,结构体我觉得可以当大号变量了,可以直接进行传参到函数,直接看示例代码:
#include <stdio.h>
#include <string.h>
typedef struct
{
char name[20];
int age;
} Student;
void method(Student student1);
int main()
{
Student student;
strcpy(student.name, "John");
student.age = 18;
printf("修改之前%s\n", student.name);
method(student);
}
void method(Student student1)
{
Student student;
strcpy(student.name, "John1");
student.age = 19;
printf("修改之后%s\n", student.name);
}
看示例代码的话其实很明显,就是将student这个大号变量直接传入参数到函数method里面了,具体的话其实我觉得很好理解,其实就是大号变量啦!
5、结构体的嵌套
真就万物可以套娃是吧,我们的结构体也是可以进行嵌套的,但是我感觉可能类似于传参了。
#include <stdio.h>
#include <string.h>
struct Message
{
char number[100];
char mail[100];
};
struct Student
{
char name[100];
int age;
struct Message msg;
};
int main()
{
struct Student s;
strcpy(s.msg.mail, "Hello World");
}
直接看示例代码,其中的话结构体Message直接被嵌套在了Student里面,所以Message中的数据也是同步在Student了,另外的话如果要定义引用的话也是从Student中引用的,就像示例代码中的:s.msg.mail 直接从Student提取嵌套的Message中的mail。直接用就可以了!