c和指针 前三章知识点以及常见的问题和程序分析


一:环境

C语言的程序执行要经历4个过程:

1、预处理   
头文件展开 去注释  条件编译   宏替换

2、编译
预处理后的结果变成汇编语言  


3、汇编
汇编语言变成二进制程序 


4、链接

把项目中使用的法链接到项目中


在linux下对应的指令是:

test.c 通过预处理后变成test.i    指令是:1  gcc -E test.c(在终端中直接显示预处理后的内容,没有test.i文件)
                                                                2   gcc -E test.c -o test.i(生成test.i文件,通过vim编辑器直接访问test.i文件)

test.i通过编译后变成test.s         指令是:1   gcc -S test.i -o test.s(生成test.s文件,通过vim编辑器直接访问test.s文件)
                                                                 2   gcc -S test.c (生成test.s文件,通过vim编辑器直接访问test.s文件

test.s通过汇编后变成test.o     指令是:1   gcc -c test.s -o test.o(生成test.o文件,通过vim编辑器直接访问test.o文件
                                                            2  gcc -c test.s(生成test.o文件,通过vim编辑器直接访问test.o文件
test.o通过链接后变成test 指令是: gcc test.o -o -test (生成test文件.通过输出./test输出结果)


test.c一步执行程序的步骤是: gcc test.c -o test(生成test文件.通过输出./test输出结果)
[hj@localhost test]$ vim test.c
[hj@localhost test]$ gcc -E test.c -o test.i
[hj@localhost test]$ gcc -S test.i -o test.s
[hj@localhost test]$ gcc -c test.i -o test.o
[hj@localhost test]$ gcc test.o -o test
[hj@localhost test]$ ls -l
total 40
-rwxrwxr-x. 1 hj hj  4638 Jul 16 06:09 test
-rw-rw-r--. 1 hj hj    70 Jul 16 06:07 test.c
-rw-rw-r--. 1 hj hj 17201 Jul 16 06:08 test.i
-rw-rw-r--. 1 hj hj   856 Jul 16 06:08 test.o
-rw-rw-r--. 1 hj hj   344 Jul 16 06:08 test.s
[hj@localhost test]$ ./test
hello world

二、C语言词法规则 需要注意的地方:

(1)、三字母词

(2)、转义字符:


(3)、标识符:


三、数据
在c语言中,仅有4种基本数据类型 ————整型、浮点型、指针和聚合类型(如数组和结构等)。所有其他的类型都是从这4种基本的某种组合派生而来。
(1)整型家族
整型家族包括字符、短整型、整型和长整型,它们都分为有符号和无符号两种版本。
注意:
长整型至少应该和整型一样长,而整型至少和短整型一样长。头文件limits.h说明了各种不同的整型类型的特点。


(2)浮点类型

浮点类型家族包括float、double 和long double类型。通常,,这些类型都分别提供单精度、双精度以及在某些支持拓展精度的机器上提供拓展精度。

注意:

long double 至少和double一样长,而double 至少和float一样长。标准同时规定了一个最小范围:所有的浮点类型至少能够容纳从10^-37到10^37之间的任何值。

浮点数字面值在默认下都是double类型的,除非它的后面跟一个L或l表示它是个long double类型的值。或者跟一个F或f表示它是一个float类型的值。


四、static关键字

(1)、


(2)、


代码块中的变量不管是静态变量还是自动变量都没有链接性

注意:静态全局变量如果没有初始化的话,默认为0


五、编程提示和总结

1、在scanf函数的标量参数前未添加&字符。

2、误用=操作符而不是==操作符来测试相等性。

3、始终要进行检查,确保数组不越界。

4、注释不要嵌套。

5、字符串常量中的字符被错误地解释为三字母词。

6、在定义类型的新名字时,使用typedef而不是#define。

7、使用名字常量而不是字面值常量。

8、用const声明其值不会修改的变量。

9、用到(ch=getchar()) !=EOF表达式记得将变量ch定义为整数变量

10、scanf()函数返回的值为:正确按指定格式输入变量的个数;当scanf函数的第一个变量格式不正确时返回值为0,即,当scanf函数的第n个变量格式不正确时,返回值为n-1

11、局部变量屏蔽全局变量

六、编程和问答



编译器会给出一个警告消息。运行程序时,如果这个long整型变量的值很小,在short变量范围内,那么结果不会有变化,但是当超过了short变量的范围,则会产生溢出,改变结果。


 有些编译器字符的默认类型是无符号的,这就是它的用处。


      否,任何一个给定的n个位的值只有2^n的组合,一个有符号的数和无符号的数仅有的区别在于他的一半值是怎么解释,在一个有符号数中,它们是负值,在一个无符号值中,它们是更大的正值


在代码块内部:这个变量是自auto变量,作用域只在这个代码块中,没有链接性。它在每次调用函数时重新初始化。在代码块外部:这个变量是static,作用域是整个源文件,有外部链接性。在程序开始运行之前,它被初始化一次。(从这四个方面去答)


两个答案都是错的,在函数内部定义变量,它的作用域只限于这个函数,用static修饰变量,只是改变了这个函数的存储的方式,不改变变量的作用域

1、判断花括号匹配问题

<span style="font-size:10px;">#include <stdio.h>
#include<stdlib.h>
int main()
{
	int ch;
	int count = 0;//定义一个计数器count
	while((ch = getchar()) != EOF)//循环输入,EOF结束
	{
		if(ch == '{')
		{
			count ++;
		}
		//当遇到{时,计数器+1
		if(ch == '}' && count == 0)
		{
			printf("不匹配\n");
			system("pause");
			return 0;
		}                      
		//当遇到}但计数器为0了,输出不匹配,即为}在{前边
		if(ch == '}' && count !=0)
		{
			count --;
		}
		//当遇到}且计数器不为0时,计数器-1
	}
	if(count == 0)
	{
		printf("匹配!\n");
	}
	else
	{
		printf("不匹配!\n");
	}//判断计数器count
	system("pause");
	return 0;
}</span>

2、转义字符

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main2()
{
	printf("\40");     //表示一个八进制的数字。八进制的40是32,所以输出空格。
	printf("\100");    //八进制的100是64,输出@。
	printf("\x40");     //16进制的40是64,输出@。
	//printf("\x100");    //\x 最多跟两个数字,它不会像\一样 超出了三位,拆成其他的字符。这个肯定报错。
	printf("\0123");    //反斜杠后面最多跟3个八进制的数,所以这个拆成了两个字符\012,3,先输出换行,再输出3.
	printf("hello...\n");//"\0183" 因为8超出了8进制数,所以,最大取到01,所以是\01 8 3三个字符
	//printf("\x0123");     //报错,\x 最多跟两个数字,它不会像\一样 超出了三位,拆成其他的字符。
	system("pause");
	return 0;
}

3、有转义字符的字符串求长度 (要分清0和\0的区别)

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
	char *p3 =  "abcdgr\afeji";
	char  *p = "abcdef'0'";  //单引号也是一个字符。
	char p2[] = {'a','b','c','0'};  //字符0不是\0,字符数组没有\0,所以在后面查找\0,直到找到\0,才停止计算长度,这是个随机值。
	 int len = strlen(p);
	printf("p = %d\n",len);   //9

	 len = strlen(p2);
	printf("p2 =%d\n",len);   //15

	len = strlen(p3);      //这里要注意:p3 = 11,而不是12,斜杠后面跟的任何字符组合起来都是转义字符。字符长度不能把\当一个字符去数。
	printf("p3 = %d\n",len);

	printf("hello...\n");
	system("pause");
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值