指针部分补充:
1.指针是一种复合数据类型,指针变量的内容是一个地址,因此一个指针可以表示该系统的整个地址合集。故按照32位编译代码,指针占4个字节,按照64位编译代码,指针占8个字节(注意:不是64位系统一定占8个字节,关键是要按照64位方式编译)
2.指针可以认为是一种数据类型,也可以认为是定义出来的指针变量。
一、常见关键字
关键字不能作为标识符(变量的名字)。
typedef
是类型定义,这里可以理解为类型重命名。
static
是用来修饰变量和函数:
使用static
来修饰局部变量——静态局部变量,其生命周期变为:进入函数创建,程序结束消失。
使用static
来修饰全局变量——静态全局变量,其作用域变为:仅在当前.c文件中。
extern
的作用是引入外部符号
例子:
下面代码将输出什么结果?
#include<stdio.h>
int sum(int a)
{
int c = 0;
static int b =3;
c += 1;
b += 2;;
return(a + b + c);
}
int main()
{
int i;
int a = 2;
for (i = 0; i < 5; i ++)
{
printf("%d \n", sum(a));
}
}
此处主要考察static修饰局部变量的特性,static修饰局部变量,该变量不会随函数的结束而消失,并且只在第一次调用时进行初始化,后序调用该函数时,使用的都是上次结束前该变量的值。
第一次循环:a=2 b=5 c=1 a+b+c=8
第二次循环:a=2 b=7 c=1 a+b+c=10
第二次循环:a=2 b=9 c=1 a+b+c=12
第二次循环:a=2 b=11 c=1 a+b+c=14
第二次循环:a=2 b=13 c=1 a+b+c=16
二、define定义常量和宏
define定义标识符常量
#define MAX 1000 //常量不能再修改
define定义宏
#define ADD(x, y) ((x)+ (y))
#include<stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum); //打印出2+3=5
sum = 10 * ADD(2, 3);
printf("sum = %d\n", sum); //打印出8*2+3=19
return 0;
}
三、分支语句
- if
- switch
1.if语句
语法结构:
if(表达式)
语句1;
else if
语句2;
else
语句3;
如果表达式结果为真则语句执行,在(表达式)
中0表示假,非0表示真。
练习:
1.判断一个数是否为奇数
#include<stdio.h>
int main(){
int a = 0
scanf("%d",&a);
if (a % 2 != 0)
{
printf("%d 是奇数", a)
}
else
{
printf("不是奇数")
}
}
2.输出1-100之间的奇数
#include<stdio.h>
int main(){
int i = 1;
for(;i <= 100; i++)
{
if(i % 2 != 0)
printf("%d",i)
}
}
3.下面代码将出现死循环打印5
#include<stdio.h>
int main()
{
int i = 0;
for (i = 0; i< 10; i++)
{
if(i = 5)
printf("%d", i)
}
}
原因为:此代码本来的想法应该是:循环10次,每次循环时如果i==5
则打印i
的结果。但if语句中表达式的==
写成了赋值,相当于每次循环尽量都是将i的值设置成了5
,5
为真,因此每次都会打印5。i
每次修改成5打印后,i
的值永远不会等于10,因此造成死循环
故:死循环的打印5
2.switch语句
语法结构
switch(整形表达式)
{
语句项;
}
其中语句项则是一些case语句
case语句形式如下:
case 整型常量表达式:
语句;
需要注意的是:
1.float
和double
类型不能作为switch
的参数类型。
2.switch
语句中的default
子句可以放在任意位置。但一般建议最好放在最后。
3.case
语句后一般放整形结果的常量表达式或者枚举类型,枚举类型也可以看作是一个特殊的常量。
4.switch
语句中的case
表达式不要求顺序,但一般建议按照次序来。
练习:
1.下面代码将如何输出?
int func(int a)
{
int b;
switch (a)
{
case 1: b = 30;
case 2: b = 20;
case 3: b = 16;
default: b = 0;
}
return b;
}
则fun(1) = ?
分析:switch的每个case之后如果没有加break语句,当前case执行结束后,会继续执行紧跟case中的语句。fun(1)=0
2.下面代码的执行结果是什么?
#include<stdio.h>
int main(){
int x = 3;
int y = 3;
switch (x % 2){
case 1:
switch (y)
{
case 0:
printf("first");
case 1:
printf("second");
break;
default: print("hello");
}
case 2:
printf("third");
}
return 0;
}
分析:switch语句时多分支的选择语句,switch中表达式结果命中那个case,就执行该case子项,如果case子项后没有跟break语句,则继续往下执行。所以最终输出为hellothird
。