C语言初级
目录
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