王道C语言初级知识点补充

1.scanf函数

f19a07c620d0458f8bf8d3456e119b9b.png

注意事项:

#include<stdio.h>
int main(){
	int i = 10;
	char a;
	scanf("%d", &i);
	printf("i = %d\n", i);
//  fflush(stdin);
    scanf("%c", &a);
	printf("a = %c\n", a);
	return 0;
}

fd31efd641b943209b6ea459543cd736.png

64e093833e594a8489a5a901a4b54d54.png

把30赋给了i,然后\n给了字符a

151cb0c35e594625b6402ef007c3fef8.png

4a45bf46b0044f79b476414ee3ab94e4.png

fb96fab6a3964aa2bebbd8219de75dee.png

 

aecb2beadaec47d684da236de96a6766.png

#include<stdio.h>
int main(){
	int i, ret;
	char c;
	float f;
	ret = scanf("%d %c%f", &i, &c, &f);
    printf("i = %d, c = %c, f = %5.2f\n", i, c, f);
    printf("ret = %d", ret);
	return 0;
}

0a320f001368463fbf34e14f39e6ef92.png

9c623956f5d941699dffbb6d0465d9a8.png

71ed96d943d34c3c8d93ac3b7c8e5fe9.png

特别注意:没有空格的情况

f8c84abb5c444eceaea81d1799f1f123.png

2.printf函数

aa7d24ec7cd8481ca468d86d9739b7ca.png

6a6ce6f8d2c64509ae9ab0ba87e7e200.png

#include<stdio.h>
int main(){
	int i = 13;
	float f = 3.14;
    printf("i = %4d, f = %5.2f\n", i, f);//默认右对齐
    printf("i = %-4d, f = %-5.2f\n", i, f);//在%后加负号左对齐
    printf("i = %04d\n", i);//右对齐,不足两位用0填充
    printf("%o\n", i);//8进制输出
    printf("%X\n", i);//十六进制大写输出
    printf("%x\n", i);//十六进制小写输出
    printf("%#X\n", i);//十六进制大写标准输出
    printf("%%\n");//输出百分号
	return 0;
}

b4fe1f0cc9154f6898e2f859029702ec.png

3.关系运算符

#include<stdio.h>
int main(){
	int i = 5;
	if(3 < i < 10)
	    printf("i在3到10间");
	else
        printf("i不在3到10间");//永远不会执行到这:3 < i < 10先执行3<5,结果为1
        //然后1<10,永远为真
	return 0;
}

a258bbd572fa44c2a544405f7f0f95d4.png

94262addbfe14cfd9a91b7f6879561b2.png

ff854389e3654da8be6e765ee1b2d251.png

9ee3028da3a647bfb7e577495e4037e7.png

4.gets函数与puts函数

b2ce447c0a77421da923ebacd239d9c8.png

 

5.一维数组

 

#include<stdio.h>
void print(int b[],int len)
{
    int i;
    for(i=0;i<len;i++)
    {
        printf("%3d",b[i]);
    }
    b[4]=20; //在子函数中修改数组元素
    printf("\n");
}
#define N 5
int main()
{
    int a[5]={1,2,3,4,5}; //定义数组时,数组长度必须固定
    print(a,5);
    printf("a[4]=%d\n",a[4]); //a[4]发生改变
    return 0;
}

数组a的内存情况 :a的初始地址为0x61fe00

821d03aabe954691bfb740e244beb46b.png

 

 

 

数组b的内存情况 :b的地址为:61fde0,b里的内容是61fe00,恰好是a的地址,也就是说,b指向a, 且b占8个字节

3861c36e5c454794b630c5e1a3563fe1.png

 

 

所以:

925fad8cd7fd487faa356e297c330077.png

6.指针与动态申请 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *print_stack(){
    char c[17] = "i am print_stack";//字符数组可以这样赋值,且与char *完全等价
    puts(c);
    return c;
}
char *print_malloc(){
    char *p;
    p = (char*)malloc(20);
    strcpy(p, "i am print_malloc");
    puts(p);
    return p;
}
int main(){
    char *p;
    p = print_stack();//数据在栈空间
    printf("p = %s\n", p);
    p = print_malloc();//数据在堆空间
    puts(p);
    return 0;
}

0d614bbbba214fc2abbec0b827cec2ee.png

原因:

b657aa29409f4ccbbda0eda3e16bfff9.png

 fa1354c2b6be40cda4ad245a59b330f1.png

7.结构体对齐

结构体的第一个成员总是存储在结构体变量开辟的空间的起始地址。

其它成员变量要存储在一个名叫对齐数的整数倍的地址。

结构体的大小必须是其最大成员的整数倍。
#include<stdio.h>
struct student1{
    double score;
    short age;
};//最大为8, short + 6 ==>16
struct student2{
    double score;
    int height;
    short age;
};//最大为8, short + int + 2 ==>16:如果紧挨的两个数据类型<=最大的,则这两个可以合并
struct student3{
    int height;
    char sex;
    short age;
};//最大为4, short + char + 1 ==>8
int main(){
    printf("s1 size:%d\n", sizeof(student1));
    printf("s2 size:%d\n", sizeof(student2));
    printf("s3 size:%d\n", sizeof(student3));
}

991e2742c05948debcb6bb7833475490.png

 

8.typedef的使用

typedef struct student{
    double score;
    short age;
}s, *ps;
// s <==> struct student
// ps <==> struct student*

 

注意:当给结构体起别名时,struct 后面的student可以省略

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值