c语言基础

来源:互联网 发布:windows xp pe 最小 编辑:程序博客网 时间:2024/06/06 03:40
回顾:
局部变量的地址不能用作返回值。
形参的地址变量是可以返回的。


///////////////////////////////////////////////////////////////
1)数组名称和指针变量的区别
数组名称是右值,指针变量是左值。
进行sizeof计算时,结果不同。
进行取地址操作,结果不同。


2)使用循环操作数组时,可以用指针变量。


3)const关键字表示只读变量,但是变量还是可以通过指针的方式修改。
说明const关键字不保险,主要是起到提示程序员的作用。
const关键字在程序的效率,可读性,和错误检测都起到了很大的作用。
const修饰指针:(先忽略类型名,看const离谁近就修饰谁)
const int *p;  ==> const *p ,修饰指针指向的对象
int * const p; ==> * const p ,修饰指针变量
const int * const p; ==> const * const p ,修饰指向对象和指针本身


4)最易变的关键字:volatile
这个关键字告诉编译器,它修饰的变量是随时改变的,不要进行优化。
从而提供对特殊地址的稳定访问。
特别是在多线程共享数据时候,该变量发挥作用。


5) 程序在内存中是分段保存的
代码段:所有语句转换的数字都存储在代码段中,代码段中的内容在运行时是不可以修改的。
全局段落:存放全局变量和静态局部变量。
栈:随着程序的运行不断变化,局部变量,块变量以及形参都会存储在这个段落里。每个函数在
栈中有自己的私有空间。栈中的一段区域可能在不同的时候被不同的函数使用。
堆:存放所有动态分配的变量,空间比较大。


6)字符串由一组连续的字符表示。第一个字符的地址可以用来表示字符串的整体。
所有字符串有以'\0'结尾。字符串字面值是一种描述字符串的方式,如"abc";
字面值在程序运行时被保存在专门的段落中,这个段落内容不允许修改
。*"abc"的结果是 'a';  错误:*"abc" = 'x'; 
同样的字符串字面值在程序中只有一份。
连续的两个字符串可以合并成一个。eg:"abc" == "a""bc";


字符数组是另外一个表示字符串的方法。
包含'\0'字符的数组都可以当成字符串来使用。'\0'的ASCII码是0,所以'\0'可以用数字 0 来代替。代表字符串的结尾。
不可以用'0'代替。
字符数组是可以被修改的。
用sizeof计算字符串的大小,会将'\0'也算进去。


7)c语言提供了对字符串操作的标准函数,在string.h中。
strlen            计算有效字符的个数
strcat            合并两个字符串,返回结果字符串,有可能溢出,被修改的字符串必须是以字符数组形式存储。
strncat           可以防止溢出
strcmp            可以比较两个字符串的大小比较的依据是ASCII码
 返回值:前面的字符比后面大返回1,小返回-1,相等返回0
strncmp           只比较前n个字符
strcpy            被修改的字符串必须是字符数组。拷贝完成后,内存中有两份一样的字符串
strncpy           复制前n个字符


8)scanf读取字符串的限制:
遇到空格就停止读取
有溢出问题


fgets读取,指定缓冲区,读入大小,和读入流.标准输入stdin.
fgets将回车也会读进去。
每次读完字符串后都需要检查输入缓冲区是否还有垃圾数据,如果有就清除。如下
char buf[10];
fgets(buf,10,stdin);
//丢弃垃圾数据:在本例中,如果输入 abcdefghijk,那么在buf中被截断成:abcdefghi'\0'   而后面的jk,在这里就成了垃圾.
if(strlen(buf) == 9 && buf[8] != '\n')
{
scanf("%*[^n]");
scanf("%*c");
}


9)多个相关字符串的表示方式
使用二维数组存放字符串的缺点 :容易造成空间浪费,不灵活。
二维数组表示的方法在内存中有两份存储:字面值 、二维数组
==>指针数组来表示:不浪费,更灵活


10)主函数的第二个参数用来表示多个字符串,类型可以是指针数组或者二级指针。


11)使数据在原地更新,如下
printf("%d\r",second);
fflush(stdout);刷新缓冲区



原创粉丝点击