C语言的易错点

重新将C语言的知识点看了一遍,把自己遗忘以及容易出错的知识点记录下来。各个知识点之间没有什么联系。

  • 定义变量时,我们使用了诸如"a" "abc" "mn12"这样的名字,它们都是程序员自己起的,一般能够表达出变量的作用,这叫做标识符(Identifier)。标识符只能由字母(A-Z,a-z)、数字(0-9)和下划线(_)组成,并且第一个字符必须是字符或下划线。
  • 使用标识符的注意事项:

1. C语言虽然不限制标识符的长度,但是它受到不同编译器的限制,同时也受到具体机器的限制。例如在某个编译器中规定标识符前128位有效,当两个标识符前128位相同时,则认为是同一个标识符。

2. C语言的标识符区分大小写。

  • 小数的合法写法:C语言小数点两边有一个是零的话,可以不用写。例如:
1.0在C语言中可写成1.
0.1在C语言中可写成.1。


  • 复合的赋值表达式:
int a = 2;
a *= 2 + 3; //运行完后,a的值是12
一定要注意,首先要在"2+3"的上面打上括号,变成(2+3)再运算。


  • 区别:
z = (2, 3, 4); // z = 4
z = 2, 3, 4;  // z = 2
要知道"="运算符的优先级大于","运算符,而逗号运算符是返回最后一个值的。(2,3,4)的结果为4,然后再把4赋值给z。而式子2则是先执行z=2,然后返回4,但这个返回值没有赋给任何变量。



  • 按不同格式输出

int x = 017;

printf("%d", x);  //输出15

printf("%o", x);  //输出17

printf("%#o", x); //输出017

printf("%x", x);  //输出11

printf("%#x", x); //输出0x11


int x = 12, y = 34;

char z = 'a';

printf("%d ", x, y); //一个格式说明,两个输出变量,后面的y不输出

printf("%c", z);





格式说明     表示内容
%d             int
%ld             long
%f             float
%lf             double
%%             输出一个百分号
%c             char
%s             字符串
%o             八进制
%#o         带前导的八进制
%x             十六进制
%#x         带前导的十六进制


scanf("%d%d%*d%d", &a, &b, &c); //跳过输入的第三个数据


  • 二维数组的初始化
int a[2][3]={1,2,3,4,5,6};
int a[2][3]={1,2,3,4,5,};  //合法,后面一个默认为0
int a[2][3]={{1,2,3},{4,5,6}}; //合法,每行三个
int a[2][3]={{1,2,},{4,5,6}};  //合法,第一行最后一个默认为0
int a[2][3]={1,2,3,4,5,6,7};  //不合法,赋值个数多于数组的个数了
int a[][3]={1,2,3,4,5,6};     //合法,可以缺省行的个数
int a[2][]={1,2,3,4,5,6};     //不合法,不可以缺省列的个数

  • 数组与指针

a[2]变成*(a+2)  a[2][3]变成*(a+2)[3],然后再可以变成*(*(a+2)+3)




  • C语言中没有字符串变量,所以用数组和指针存放字符串:

1. char ch[10]={"abcd"};

2. char ch[10]="abcd";

3. char ch[10]={"a","b","c","d"};

4. char *p="abcd";

5. char *p;

         p="abcd";

6. char ch[10]; //错了,数组名不可以赋值

    ch="abcd";

7. char *p={"abcd"};  //错了,不能够出现大括号




  • 把s指针中的字符串复制到t指针中的方法

1. while( (*t=*s)!= null ){s++; t++;} //完整版本

2. while( *t=*s ){s++; t++; } //简单版本

3. while( *t++=*s++ ); //高级版本




  • typedef是取别名,不会产生新类型,它同时也是关键字

1. typedef int qq; 那么 int x 就可以写成 qq x

2. typedef int *qq; 那么 int *x 就可以写成 qq x



  • 关于static

static int x; //默认值为0

int x;   //默认值为不定值



  • 使用共用体的注意事项:

1. 每个成员的起始地址都是相同的,所以一次只能存放一种类型的成员,也就是每次只能有一个成员在起作用。

2. 在存入一个新的成员信息后,原有的成员信息就会被覆盖而失去作用。

3. 整个共用体型的起始地址与各成员的起始地址是同一地址。

4. 关于共用体类型的变量,不能为其赋值,不能定义共用体变量时对其初始化,也不能引用共用体变量名得到一个值。

5. 共用体类型变量不可以作为函数的参数传递,也不可以作为函数返回值,但是可以使用指向共用体的指针。

6. 共用体可以出现在机构体类型的定义中,也可以定义共用体类型的数组,反之也成立。




  • 动态内存与静态内存在分配方式上的区别:

1. 静态内存的分配是在程序开始编译时完成的,不占用CPU资源;而动态内存的分配是在程序运行时完成的,动态内存的分配与释放都是占用CPU资源;

2. 静态内存是在栈上分配的;而动态内存是在堆上分配的。

3. 动态内存分配需要指针和引用数据类型的支持,而静态内存不需要。

4. 静态内存分配是在编译前就已经确定了内存块的大小,属于按计划分配内存;而动态内存分配是在程序运行过程中,按需分配。

5. 静态内存的控制权交给编译器,动态内存的控制权交给程序员。

猜你喜欢

转载自blog.csdn.net/li_wei_quan/article/details/79795136