C语言知识点总结

目录

易错点

1:index=index++

2:

3:判断指针数组和数组指针

4:函数指针和指针函数

5:\ddd

6:​编辑

7: 

8:​编辑

9:


易错点

1:index=index++

#include <stdio.h>

int main(){
    int index=1;
    for(int i=0;i<10;i++){
        index=index++;
    }
    printf("%d\n",index);
    return 0;
}

index==1;因为index=index++的过程是

temp=index;index=index+1;index=temp;

所以index=index++执行结束后,index==1

 index=++index的过程是

index=index+1;temp=index;index=temp;

所以index=++index执行结束后,index==2


2:

*p++ 和 *(p++) 等价


3:判断指针数组和数组指针

int *pa[5] :指针数组,数组大小为5,数组内的元素为int类型指针

int(*pa)[5]: 数组指针,指针,指向一个数组,数组存放5个int类型的元素


4:函数指针和指针函数

int (*p)(int):函数指针,一个指针指向返回值为int,函数参数为int的函数

int * p(int): 指针函数,p为一个函数,参数为一个int类型的数,返回值为一个int类型的指针


5:\ddd

\ddd(d为任意数字)在转义字符中表示三位八进制,因为八进制中的数只有0-7,因此\018不能表示三位八进制,所以取\01。而\t在转义字符中表示制表符,所以\t算一次。然后a一次,\01一次,8一次,b一次,c一次。所以是6次。


6:

*(a + 1):直接用数组名a代表数组首元素的地址,+1再解引用是数组第二个元素的内容

(&a + 1):对整个数组取地址代表数组的地址,对数组的地址+1,可以将整个数组看成一个数据类型,+1则地址往后便宜该数据类型的大小,则ptr指向5的后一位,由于ptr为int类型的指针,-1往前偏移4个字节(即偏移一位),指向5,再解引用结果为5

相同类型的题:

1 2 3

4 5 6

首先把二维数组看成一个一维数组,其中每一行为一个元素,即

123   456  (123和456各为一的整体)

则对 *(*(A+1)+1)进行刨析

A为(一维数组)首元素地址,即元素 123 的地址。所以(A+1)为元素 456 的地址

*(A+1)解引用为数组 4 5 6

*(A+1)为数组名,也是首元素地址,而 *(A+1)+1 为元素 5 的地址

解引用 *(*(A+1)+1)为 5 


7: 

这个题目考虑两个点…1、位域,x,y,z分别是3bit(位),4bit,5bit,但首先需要注意,8bit对齐一个字节(Byte),所以x,y属于int的第一个字节,z是int的第二个字节,该int还有两个字节没有使用。2、在没有说明的情况下,结构体中的字节对齐按最大长度的变量的字节数对齐,也就是这里的double,8字节对齐,一共16字节。

8:

1Byte|1Byte|1Byte|1Byte|

|     short      | char | char |

|                long                |

| char | 填充|  填充|  填充|

|                 int                 |

共计4 * 4 = 16 Byte,选A

原因:

1. 在32位机中,

char     1字节

short    2字节

int        4字节

long     4字节

2. 数据在计算机中按“边界对齐”方式存储,支持按字寻址、按半字寻址、按字寻址,

半字地址必为2的整数倍,字地址必为4的整数倍,

所以半字长和一个字长的数据在存储时,就算前面有“空位”,为了保持地址的“一致性”,机器会对空位进行填充。

3. 比如:

|1Byte|1Byte|1Byte|1Byte|

| char | char | char | 填充 |

|      short     |     short      |

|      short     |     填充       |

|                  int                 |

|                 long               |

9:

 就近原则,int const *p = &n;修饰的是*p,即指针类型,能修改指针指向的地址,但是不能修改指针指向地址的值。
存放p的地址假设是0Xff01;    p = &n, *p = 10;

p++ 后指针指向的地址 + 1,(由于是int类型,实际是加4) p = 0Xff05;

10

 10

 首先_x5是静态变量可以不用管它,其次是要考虑字节对齐的问题。对于结构体中没有含有结构体变量的情况,有两条原则:1)结构体变量中成员的偏移量必须是成员大小的整数倍;2)结构体的最终大小必须是结构体最大简单类型的整数倍。x1的偏移量是0,长度是8,符合;x2的偏移量是8,长度是1,符合;x3的偏移量是9,长度是4,不符合,需要在x2之后填充3字节使得x3的偏移量达到12;x4的偏移量是16,长度是2,符合;此时总长度为(8)+(1+3)+(4)+(2)=18,而最大简单类型为long long长度为8,因此需要在x4之后再填充6字节,使得总长度达到24可被8整除。因此sizeof(xx)的结果为24。

11

'a'-1'a'-'1'是两个不同的表达式,具有不同的含义。

'a'-1表示将字符'a'的ASCII码值减去1,即96,它对应于字符'`'。

'a'-'1'表示将字符'a'的ASCII码值减去字符'1'的ASCII码值,即'a'的ASCII码值97减去'1'的ASCII码值49,结果为46,它对应于字符'.'。

因此,这两个表达式的结果不同。

'a'+'2'-'0'是一个字符运算表达式,按照 ASCII 码进行计算。

首先,字符'a'的 ASCII 码值为97,字符'2'的 ASCII 码值为50,字符'0'的 ASCII 码值为48。

所以,'a'+'2'-'0'可以转化为 (97 + 50 - 48),结果为99,对应于字符'c'。

因此,'a'+'2'-'0'的结果是字符'c'

字符数字减去‘0’,相当于变成整数

11

 逗号表达式取尾

当一个语句是由多个被逗号运算符隔开的表达式组成时,此语句的值为最后一个表达式的值。

逗号表达式值为逗号右边的值,先算括号里的x=20,括号内的逗号表达式的值为100,但整个表达式的值是20+25=45

12

一个数与这个数减1的结果进行'&'按位与运算,结果为:这个数二进制数最右边的1变为0;

举例说明如下:

X=5;  

5&(5-1) = 010 1 & (0100) = 010 0

经过上述计算,5的二进制最右边的1变为了0,由此可知,题目中count是用以统计x的二进制中1的个数的

9999的二进制表示为:10011100001111 共有8个1,显然,答案为A。

13

fgetc函数——读1个成功,带回所读的字符,失败返回文件结束标志EOF(-1);

fputc函数——输出1个成果,返回值就是输出的字符,失败返回EOF;

fgets函数——读指定长度的大小成功,返回地址str,失败返回NULL;

fputs函数——输出一个字符串成果,返回0,失败返回非0;

14

2. 多个-alloc的比较:

    alloc:唯一在栈上申请内存的,无需释放;

    malloc:在堆上申请内存,最常用;

    calloc:malloc+初始化为0;

    realloc:将原本申请的内存区域扩容,参数size大小即为扩容后大小,因此此函数要求size大小必须大于ptr内存大小。

15

 

%md     以宽度m输出整型数,不足m时,左补空格,如果超出,则按实际输出
%0md   以宽度m输出整型数,不足m时,左补零,如果超出,则按实际输出

%m.nf   以宽度m输出实型小数,小数位为n位

需要注意的是:当指定数据宽度小于数据的实际宽度时,对整数,按该数的实际数据宽度输出,对浮点数,相应小数位的数四舍五入。

16

 

  • \b代表退格符,相当于删除前一个字符。
  • \r代表回车符,将光标移至行首。
  • \'表示单引号字符。
  • \\表示反斜杠字符。
  • \n代表换行符,将光标移行的行首。

17

 无符号号整数和有符号整数相加,有符号整数转化为无符号整数,signed int b 变成了一个很大的数,所以a + b是>0的,选A

18

 该题目中的表达式应该看为a =( (5) ? 0 : 1),虽然5不是一个判断表达式,但是也符合非0,构成判断为真,所以a=0

持续更新。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机二级C语言知识点主要包括语法基础、数据类型、运算符、控制语句、函数、数组、字符串、结构体、指针等内容。 首先是语法基础,包括标识符的命名规则、注释的使用方法、变量的定义和声明等。掌握这些基础知识是理解后续知识的基础。 其次是数据类型,C语言中主要包括基本数据类型(如int、float、char等)和派生数据类型(如数组、结构体等)。对各种数据类型的特点、表示范围以及存储方式的了解,是编写程序的基础。 运算符包括算术运算符、关系运算符、逻辑运算符、位运算符等。掌握运算符的优先级和结合性,能够正确理解和使用运算符,编写出更加高效、准确的程序。 控制语句主要包括条件语句和循环语句。条件语句使用if-else语句和switch语句进行条件判断和多分支选择。循环语句包括for循环、while循环和do-while循环,用于重复执行一段代码。了解这些控制语句的用法和特点,能够正确地控制程序的执行流程。 函数C语言的重要组成部分,能够提高代码的可重用性和可读性。学习函数的定义、调用和参数传递方式,能够编写出结构清晰、模块化的程序。 数组是一种能够存储多个相同类型数据的容器,了解数组的定义、使用和特点,能够处理大量数据,并进行各种操作。 字符串是一组字符的集合,掌握字符串的定义、初始化和操作函数的使用,能够处理字符串相关的操作,如拼接、比较等。 结构体是一种自定义的数据类型,可以包含多个不同类型的数据成员,了解结构体的定义和使用方式,能够处理更加复杂的数据结构。 指针是C语言的重要概念,通过指针可以直接访问内存地址,了解指针的定义、初始化和使用方式,能够灵活地处理内存中的数据。 综上所述,掌握二级C语言知识点,对于理解计算机程序的执行原理、提高编程能力具有重要意义。通过实践和不断的积累,能够有效地应用这些知识点编写出高质量的C语言程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值