1、getchar()处理 字符 输入,scanf()处理 数值 输入;
2、getchar()、putchar()要用 ’ ’ – 单引号;
3、getchar()不会跳过换行符,而是直接读取,而scanf()则会跳过;
4、scanf()在double类型下,只能用%lf,而不能用%f,而在float下,只能用%f,但double使用范围更广;
5、while循环可以丢弃scanf()后面的所有字符,即在scanf()后面(即便有几行距离,但只要在同一 {} 里),就有用,也可以丢弃换行符,防止getchar()读取;
6、getchar()和用%c的scanf()可以接受所有字符;
8、注意输入scanf()的字符后回车,换行符会在字符后面,要注意后面是否有getchar(),防止被getchar()读取;
9、\b的含义是,将光标从当前位置向前(左)移动一个字符(遇到\n或\r则停止移动),并从此位置开始输出后面的字符(空字符\0和换行符\n除外),就是同行的前一个字符没了;
10、新函数和main主函数的同名变量互不影响,相互独立;
11、设置新函数可以只用声明变量类型,而不用声名变量先,–imin(int,int);
11.plus、imin(int a,int b)中的a和b是假名,要重新int a,b;才行,所以声名变量可随意一些;
11plus2、设置新函数可以这样:
imin(a,b)
int a,b;
{}
还可以这样(适用于较小的函数):(于函数头的位置)
int imin(int a,int b) { return a > b ? a : b} (不用加 ;)
12、(。。。)?。。。。:。。。 --如果括号成立,则是?后面的值,否则是:后面的值(很好用,要记);
13、函数中用多个return语句是没有问题的,但是要注意return输出的是哪个变量;
14、函数类型是指返回值的类型,而非参数的类型,即输出结果是返回值的类型;
15、也可以在main()里设置新函数;
16、表示函数无参数应当在()中加void;
17、sizeof整型常量表达式的值必须大于0;
18、二维数组中不同行的初始化互不影响;
19、数组表达法是在变相利用指针;
20、dates + 2 == &dates[2] *(dates + 2) == date[2] (+号不相当于加号,而是与[]效果相同);
21、指针求差,是计算两指针元素间的距离,不如[2]与[0]相差2个int(int是自己先声名的);
22、*和++优先级相同,由于结合律,因此:
{ *start++ – 先递增后指向
{ *++start – 先指向后递增 ;
23、不能重复声名变量,作用域会自动忽略你后面声名的变量,若同时在一个句子中还给它重新赋值了,那么该重新赋值无效;
24、定义数组形参时可以用const,表示该数组不可修改,因此若出现如arr[i]++这样的错误的话,系统会报错;
25、可以把有const和没const的数据指向有const的指针,而没有const的普通指针只能被无const的数据指向;
26、设int * n;==>*n–是指针n所存的值,n是内存的地址,&n是指针本身地址;
27、用非const标识符修改const的数据是未定义的,如在一个未被const标识的数组函数中以被const标识的数组作
为实参;
28、const的位置会影响声明,
EX:const double * pd = rates; (rates是已经初始化的一个的非const数组)
*pd = 9.99(*pd为rates[0],值不可改变)
而 double * const pd = rates;
*pd = 9.99(正确的,而且是改变了rates[0]的值)
因此 const double * const pd = rates;–既不能改变指针指向的地址,也不能改变指针的值;
29、多维数组,如rates[] [] (补充);
30、对于多维数组的地址,维数增加,为得到最内部的值,需要多重解引,如rates[2]][2],pfd = rates;,则需要**ptd,解引两次,维度越高,指针越复杂,解引次数越多;
31、 一般,一个指针是只指向一个类型值,如*pz,但是若为(pz)[2],则说明该指针指向两个类型值,即可用pz[2][2]来代替rates[2]2,以此类推;
32、不同类型的指针不能互相赋值给对方;
33、int (* pt)[4]相当于int pt[][4](第一个空括号表示pt是指针);
33PLUS、一般,声明一个指向N维数组的指针时,只省略最左边括号的值,如:int sum4d(int ar [ ][12][20][30],int n);
34、变长数组是指在创建数组的时候可以使用变量指定数组的维度,而不能改变大小;
34PLUS、如果使用变长数组改变维度的话,需要提前声明变量,而不应该将数组的声明提到变量前面;
35、常量包括字面量和符号常量;
36、字面量可以忽略形参变成匿名数组,如:(int [2]){50,60};还可以忽略大小,而大小会根据元素数量来判断,如(int ar[]){50,60,70};
37、复合字面量的数组是匿名数组;
38、复合字面量必须在创建的同时使用;
39、C语言中要先声明变量后在下一个语句才能使用,不然会报错;
40、对scanf用%c时要注意空格,即–" %c\n",这是为了告诉程序忽略空格,不然下一个scanf(“%c”,n)会扫描到上一个scanf的\n,而不是输入的字符;
41、puts()函数会自动在字符串末尾加换行符;
42、编译器在对字符串处理时会自动在末尾加上\0字符,如果想让一个数组内的字符形成字符串,就应该在末尾加上"\0";
43、数组和指针的区别一:只有指针可以进行递增,即*(heart++),因为递增运算符只能用于变量名前;
44、数组的元素可以是变量(未被const),而数组名不是变量;
45、如果修改字符串,不应该用指针指向字符串字面量,不然会影响所有该字符串的的代码;
46、指向字符串的时候用指针更高效,指针只需拷贝值的地址,而数组需要拷贝整个字符串,但是如果要改变字符串,还是不用指针会更好;
47、计算机在读取字符串的时候不会顺便计算长度,后再分配空间,因此未初始化指针最好不要用scanf;
48、fget()函数会保存换行符,但末尾不会添加换行符,而get()函数则与之相反;
49、想将换行符处理掉,可以将该数组对应位置的值改为’\0’,如ar[i]=‘\0’;
50、如果scanf里用了%ns,即限定了字段宽度,则超过字段宽度时,会被第二次scanf调用继续读取数据给下一个变量;
51、put(ar[5])意思是从数组ar第六个元素开始输出;
52、strcmp()用于比较两个字符串大小,自动判断为<,若左值小于右值,则输出-1;若左值大于右值,则输出1,若左右值相等,则输出0;
53、C字符串都是由’\0’作结尾;
54、字符串可以储存在字符数组中,如:char ar[2] = {“dadsad”,“dsadsdasdad”};
55、结构的声明可以在所有函数外部,也可以放在一个函数定义的内部;
56、声明结构可以和定义结构变量组成一个步骤,即在声明结构后花括号加上变量名;
57、结构体成员运算符优先度最高;
58、while(getchar() = ‘\n’)continue;–getchar()是用于在缓冲区取走每一个字符,并用continue来去除每一个·取走的字符,直到getchar() == '\n’时,循环停止,最后只读取\n
这种做法是为了防止scanf()会不读取结尾的回车键(换行符),可用于超出数组范围时删去多出字符,防止被下一个scanf,getchar,fgets读取;
59、if和else以及else if,优先级是从上到下依次,对于两个if,若程序满足这两个if,则依次输出两个if内的语句,若为if,else if,即在if的条件下在else if,若if和else if 均满足,则只输出if,除非只满足else if;
60、&和*是一对互逆运算符;
61、do…while和while的区别,在while为假的时候,会先执行一遍do语句才结束循环,及从上到下,到while后结束;
62、结构可以赋值给结构(相同的定义下),但数组不行;
63、strcmp比较函数用法,strcmp(a,b)–>从左到右边看,若a>b,则返回>0的数;若a<b,则返回<0的数;
64、strchr()函数–strchr(st,‘\0’)–》第一个参数是字符串st,第二个是填字符,指在st函数中搜索该字符,用a = strchr(st,‘\0’)将该字符串中的字符地址给a,a的改变可改变该字符的值以及源字符串的字符的值;
65、strcat(array1,array2)–将两个字符串数组连接起来,2接1后面;
66、scanf()在输入空格和TAB时会停止读取,只有换行符才会结束输入,而用gets()可以接受空格和TAB;
67、NULL指针可以用零值表示;
68、static (variable) – 将自动变量变为静态储存;
69、当用static声明函数或是代码块外的变量时,它会修改连接属性,而标识符的储存类型和作用域不会改变;
70、当用static于代码块内部声明变量时,其用于修改变量的储存类型,从自动->静态,在代码块执行完后销毁;
71、在修饰变量的时, static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
static修饰全局变量的时,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。–CSDN博主「happy_child_」的原创文章中摘取;
72、else字句从属于最靠近它的不完整的if语句;
73、continue语句是终止当前的那次循环,在执行完continue语句后重新测试表达式的值,决定是否继续执行循环;
74、for循环里,每个分号间的条件是有先后顺序的;
75、不能企图通过在函数中新创指针来改变指针形参的值而使指针实参的值改变(新创指针没有指向任何地址,有问题),形参和实参的地址不同。而用整型来替换指针形参的值可以改变实参的值;
76、a[7] == *(a+7)
77、"#"是“字符串化”的意思,将出现在宏定义中的#是把跟在后面的参数转换成一个字符串。
78、赋值方式。可以对字符指针变量赋值,但不能对数组名赋值。(数组名是常量) // 数组名是指针常量;
79、字符数组中各元素的值是可以改变的(可以对它们再赋值),但字符指针变量指向的字符串常量中的内容是不可以被取代的(不能对它们再赋值);
80、