一.选择题
1.关于C语言关键字说法正确的是:()
A.关键字可以自己创建
B.关键字不能自己创建
C.关键字可以用作变量名
D.typedef不是关键字
答案:B,A选项错误原因:关键字是由编译器定义的,不能由自己定义或者创建,B选项错误原因:关键字不能用作变量名,否则编译器将报错,D选项错误原因:typedef为类型别名的关键字,其作用是为名称复杂的数据类型定义一个简单的别名
2.用在switch语句中的关键字不包括哪一个:()
A.continue
B.break
C.default
D.if
答案:A,这个将在下面详细进行讲解
3.以下不是C语言关键字的是:()
A.int
B.define
C.struct
D.break
答案:B,A选项错误原因:int为整型,属于C语言的关键字,C选项错误原因:struct用于创建结构体,属于C语言关键字,D选项错误原因:break用于终止循环,属于C语言关键字
4.以下代码运行的结果是什么:()
#include<stdio.h>
int sum(int a)
{
int c = 0;
static int b = 3;
c+=1;
b+=2;
return (a+b+c);
}
int main(void)
{
int i;
int a = 2;
for(i = 0;i<5;i++)
{
printf("%d\n",sum(a));
}
}
A. 4 8 10 12 14
B. 8 10 12 14 16
C. 10 12 14 16 18
D. 12 14 16 18 20
答案:B,首先声明并初始化了变量c,使得c=0,随后声明并初始化了一个静态变量b,b=3,随后将变量c加上1 , 变量b加上2 ,随后返回a+b+c的值,其中a=2,则可以通过计算得出 第一次输出的值是8
故选B,如图所示:
二. 指针的补充
1.int* 是一个指针变量的数据类型
int* 中的 * 告诉我们变量p是指针变量,p所指向的对象的数据类型为int整型
p 中的 * 与int中的 * 不一样,它代表的是解引用操作符/间接访问操作符
2.同时我们也需要学会利用sizeof操作符计算指针变量所占用的内存大小,如以下代码:
#include<stdio.h>
int main(void)
{
printf("%d\n",sizeof(int*));
printf("%d\n",sizeof(float*));
printf("%d\n",sizeof(double*));
printf("%d\n",sizeof(char*));
getchar();
return 0;
}
在win32环境下运行则输出的全都是4,如果改为x64平台,则输出的内容全都是8
三.结构体
常见类型:int char double
但是我们日常生活中需要表达很多的复杂对象,不能简单的用数据类型去表示,比如人,需要有名字,性别,身高,等等,这时候需要使用结构体来描述,结构体需要自己进行创建,使用struct结构体关键字来进行创建,如使用以下代码来存储书名、售价的信息
#include<stdio.h>
struct Book
{
char name[20];
unsigned int price;
};
int main(void)
{
struct Book book1 = {"C语言设计",110};
printf("书名:%s\n",book1.name);
printf("售价:%d\元n",book1.price);
getchar();
return 0;
}
代码解析:首先创建了一个名称为Book的结构体,结构体中声明了字符串数组变量name,其大小为20
声明了无符号整型变量price,在代码17行使用struct()结构体函数创建了变量book1,并给其赋值,赋值时需要和上方的成员类型一一对应,随后调用printf()函数进行输出,注意!当输出书名的时候,我们需要用到结构体中的name成员,所以我们需要输入 book1.name,当需要输出售价的时候我们需要用到结构体中的price成员所以需要输出 book.price
讲完代码的大意我们再来看看使用struct函数的时候有哪些是需要注意的
1.在使用struct创建结构体时需要注意大括号的后面是需要有 ; 作为结束标识
2.struct结构体函数的本质是利用结构体类型---->创建该类型的结构体变量
3.struct结构体中的成员数据是可以进行改变的,如以下代码:
#include<stdio.h>
struct Book
{
char name[20];
unsigned int price;
};
int main(void)
{
struct Book book1 = {"C语言设计",110};
printf("书名:%s\n",book1.name);
printf("售价:%d\元n",book1.price);
book1.price = 10;
printf("打折后的售价:%d\n",book1.price);
getchar();
return 0;
}
我们可以看到对book1变量中的price成员进行修改后,book.price的值可以发生改变,打折后的售价变成了10
4.将结构体变量的地址以指针的形式进行存储
#include<stdio.h>
struct Book
{
char name[20];
unsigned int price;
};
int main(void)
{
struct Book book1 = {"C语言入门",100};
struct Book* pb = &book1;
getchar();
return 0;
}
这里是struct Book* 是变量的类型,它定义了一个指针变量pb,指针pb指向的是book1,同时我们也可以使用pb来输出书名和价格,如以下代码:
#include<stdio.h>
struct Book{
char name[20];
unsigned int price;
};
int main(void)
{
struct Book book1 = {"C语言入门",100};
struct Book* pb = &book1;
printf("书名:%s\n",(*pb).name);
printf("售价:%d元\n",(*pb).price);
getchar();
return 0;
}
我们使用*解引用操作符将变量pb进行解引用操作,再打印出结构体的成员,同时还有一种更加简洁的方法,如以下代码:
#include<stdio.h>
struct Book{
char name[20];
unsigned int price;
};
int main(void)
{
struct Book book1 = {"C语言入门",100};
struct Book* pb = &book1;
printf("书名:%s\n",pb->name);
printf("售价:%d元\n",pb->price);
getchar();
return 0;
}
利用 -> 打印出书名与价格,这时候pb已经是一个指针了,所以可以直接使用 -> 打印出book1的name结构成员,同理使用 -> 可以打印出book1的price结构成员
我们再来看一下 . 与 -> 操作符
当我们需要打印出结构体变量的成员时候,我们可以用 . 来找到
-> 则表示结构体指针,用于指向结构体成员
补充:如果需要更改书名则可以使用strcpy()函数,全程string copy(字符串拷贝),如需要将C语言入门改成C++则可以使用以下代码
#include<stdio.h>
struct Book{
char name[20];
};
int main(void)
{
struct Book book1 = { "C语言入门"};
strcpy(book1.name, "C++");
printf("Book name=%s\n", book1.name);
getchar();
return 0;
}
strcpy()函数为库函数,如果需要使用strcpy()函数,则需要声明头文件string.h
这时候我们运行程序就会发现书名从原先的C语言入门变成了C++
2023/7/17
王起舟