C语言(二)

C语言初级

目录

C语言初级

1,指针初级

2,结构体

3,条件语句

4,scanf() , getchar()

scanf和getchar()的区别

缓冲区:

5,switch语句


1,指针初级

指针实际上表示的就是一个地址,指向某一个变量的地址,通过解引用便可以得到这个变量的具体数值。

#include <stdio.h>
int main()
{
	int a = 0;				//a在内存中要分配空间,4个字节,32位。
	//现在在我的电脑中占据8个字节,也就是64个bit位,64位。
	printf("%p\n", &a);		//%p专门用来打印地址
	int* pa = &a;			//pa是用来存放地址的,在C语言中pa叫指针变量,
	//  *表示指针变量
	//  int表示pa执行的对象是int类型的。

	char b = 'w';			//单引号表示字符 双引号表示
	char c='a';
	char c1[]="asdfasdf";
	char* pc = &b;
	*pa = 10;				//*pa表示解引用操作,可以间接地改变b的值,*pa就是通过pa里面的地址找到b
	printf("%p\n", &b);
	printf("%c\n", b);
	return 0;
}

//输出

//输出:
0000001363EFF544
0000001363EFF584
w

2,结构体

有三种方式可以从结构体变量获得成员变量

1,(结构体变量名).(成员名)                s.name

2,(结构体指针解引用).(成员名)        (*sp).name

3,(结构体指针)->(成员名)                sp->name

//结构体可以创建新的类型出来
struct stu
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct stu s = { "张胜男",18,90.0 };
	printf("1:%s %d %f\n", s.name, s.age, s.score);	//第一种写法
	struct stu* sp = &s;
	printf("2:%s %d %f\n", (*sp).name, (*sp).age, (*sp).score);	//第二种写法
	printf("3:%s %d %f\n", sp->name, sp->age, sp->score);	//第二种写法
	printf("%d\n", strlen("c:\test\121"));
	printf("%d\n", strlen("\t"));
	
	return 0;
}

//输出:

//输出:
1:张胜男 18 90.000000
2:张胜男 18 90.000000
3:张胜男 18 90.000000
7
1

3,条件语句

if else语句遵循就近原则,else总是和离他最近的if组成一对

int main()
{
	int a = 1, b = 2;
	if (a == 2)
		if (b == 2)
			printf("haha\n");
	else
		printf("hehe\n");			//else只和离得最近的if进行匹配,形成选择语句
	return 0;
}

输出结果为空,什么都不会打印。

因为else和第二个if组成条件语句,然而,第一个if语句(a==2)执行结果为否,所以根本不会跳到第二个条件语句,直接return 0,程序结束。

4,scanf() , getchar()

getchar()函数:从标准输入流上(键盘)获取一个字符。

scanf和getchar()的区别

区别:
1.scanf返回成功赋值项个数,并将数值赋值到指定参数上,而getchar只读取一个字符并返回其ascii码,并且可以赋值也可以不赋值。

scanf("%d",&a);
getchar();
ch =  getchar();   //两者都正确
2.结束输入的方式不同

scanf遇到 回车(enter),空格,TAB 就会结束一次输入,空格不会接收

getchar函数只以回车Enter结束输入,接受空格符。

3.

scanf在一次输入结束后,不会舍弃最后的回车符(即回车符会残留在缓冲区中)

getchar回车作为结束的标志,所以在敲回车时'\n'也被存入缓存

注意:scanf()在读取数字时会跳过空格、制表符\t和换行符\n!
        \r是回车,\n是换行


缓冲区:

        缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

  缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。

根据缓冲区来解决一些问题:

在下面的程序中,我们希望输入:a,b,c;   输出;a,b,c ;

int main()
{

    int i = 3;
    while(i--)
    {
        char c = getchar();
        printf("%c\n", c);
    }
    return 0;
}

//输出:

a
a


b
b

//到这里程序就结束了,没有给我们输入c的机会

原因:第一次循环输入a时,我们追加了一个回车作为结束,但是回车符留在了缓冲区,没有消失。

当循环到第二次时,getchar()函数发现缓冲区还有数据(回车符),直接拿来用了,c在这一次循环就是一个回车符,所以打印两个回车。

当循环到第三次的时候,这时候缓冲区没有数据,getchar()需要我们输入一个字符,这时候才输入b,输出b。

三次循环结束,自然不再需要输入c。


那么该如何改进,使得输入三次,打印三次字符呢?只需要getchar()取出缓存区的内容即可。

int main()
{
    while(i--)
    {
        char c = getchar();
        printf("%c\n", c);
        getchar();
    }
    return 0;
}

输出:

a
a
b
b
c
c

5,switch语句

直接示例:

//计算a = 1时,b的数值
int main()
{
	int a = 1;
	int b = 0;
	switch (a)
	{
	case 0: 
		b = 10;
	case 1: 
		b = 20;
	case 2: 
		b = 30;
	case 3: 
		b = 40;
	default: 
		b = 0;
	}
    return 0;
}

//输出:

0

原因:switch中的case语句找到a的值后,执行分支语句case 1:b = 20;之后会继续执行case 2的情况一直到default:b = 0。只要没有遇到break语句,switch就会一直执行到最后。

解决办法:每一个分支语句后面加上break语句;

int main()
{
	int a = 1;
	int b = 0;
	switch (a)
	{
	case 0: 
		b = 10;
		break;
	case 1: 
		b = 20;
		break;
	case 2: 
		b = 30;
		break;
	case 3: 
		b = 40;
		break;
	default: 
		b = 0;
		break;
	}
	printf("%d\n", b);
	return 0;
}

输出:

20

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值