lumped 集成总结 mandating托管 consecutively连续地 contiguous临近的 mnemonic记忆力的 mimics 酷似 魔方 bind捆绑 synonym同义词 syntactically依照语法 consistent一致 rudimentary退化的 初步的 indices index的复数 interchange 互相转换 mnemonic记忆的
abbreviation 省略 略号 cryptic神秘的 有隐含意义的 lexicographically字典顺序 premium优质的 保险 首要? criteria标准准则
1 符号& 只能用于变量和数组
2指针指向特定类型的对象 (void可以指向任何对象 但是不能被引用)
*ip = *ip + 10; *和&优先级比算数运算符高 等于*ip增加 10
y = *ip+1; *ip 加上1 给y
*ip +=1; 等于++*ip; 等价于 (*ip)++; 为什么要加括号呢 因为*和++ 等一元运算符是右往左计算的
3设 int *pa; pa = a[0];(或者写成pa = a;) 数组名代表数组第一个元素的地址
指针是一个变量 pa如果是一个指针 pa=a pa++ 合法的 反之 数组名不是一个变量 a = pa 及 a++不合法 在传递给实参的时候 实际上传递的是一个地址
如strlen(“hello, world”); strlen(array); strlen(ptr);
如果确定元素存在 那么a[-1] a[-2]也是合法的 代表0之前两个数字 当然 过界的引用是非法的
(多一句 数组是从0开始的 你定义一个 int a[10] 实际上是a[0]~a[9])
4 指针初始化的时候可以初始化赋值一个地址或者0 其中0 不是任何有效数据的地址 可以作为返回值来使用. 指针和整数不能相互转换,0是一个例外
5
5任何指针和0及同一数组的指针比较有意义 不同数组之间指针比较是未定义的
6int 可能容不下一个字符组的大小 而 stddef.h中的ptrdiff_t可以包含两个指针之间的差值 在标准库下可以用size_t(sizeof返回的无符号类型)
7同类型的的指针才能有效运算 两个同数组的指针只能相减 指针可以加或者减去一个整数 其他都是非法的 什么指针相加 相乘 相除 移位 遮盖 或者强制转换float double 都不行 (void *的指针可以)
8 char amessage[ ]="now is the time"; // amessage是一个数组 正好能包括字符加一个\0
char *pmessage="now is the time"; //pmessage是一个指针
9while((*s++=*t++)!= '\0'); 先引用值给s 然后再自增s和t *p++;//这里*和++为同一优先级,P先和++结合;右移P++是先使用P的值,后P的值+1
是否为\0也是多余的 while(*s++=*t++) ;
10 *--p; 先减p再引用
*p++ =val; 将val压进栈 val = *--p;将top压出栈
11断电了..... char类型也能存放一些较小的非负整型数字
12逻辑表达式的值为0和1 数组按行存储
13二维数组是一个特殊的一维数组 可以看成有两个元素 每个元素是一个数组的数组 另外二维数组初始化可以用这样的形式 a[2][3]={{1,2,3},{4,5,6}}; 这种方式的好处是比较直观
14二维数组在传递给实参的时候 可以省略行向量 因为是传递一个指针指向一个一维数组 一维数组每个元素即是一个数组 如 f(int a[],[3])或者 f(int (*a)[3]) 这代表一个指针指向一个有三个整数的数组
15 []的优先级高于 * 所以要加括号 去了括号 int *a[3]; 是一个3个指向int的指针
16字符串数组 如 char * name[]={“1234”,“dfsdfsd”,“fgdfgd”}; 其中 name[0] name[1]] name[2] 分别代表指向1234 dfsdfsd fgdfgd的指针。
17二维数组 可以用列数乘以所在行数+列数进行计算
18 int a[10][20];和int *b[10];的区别在于 b数组每个指针可以元素不同 如20个 10个 如 char *name[]={"illegal month,"Jan","Feb","Mar"};
19命令行参数 第一个为argc为参数计数 二为参数向量是一个指向一个字符串的指针 由于 argv[0]是程序名 所以argc最小为1 1代表后面没参数 如图下 argc=3 argv[argc-1]为最后一个字符串 argv[argc]规定为0(null 指针)
printf((argc>1)? "%s" : "%s", *++argv);
20 (*++argv)[0]] 代表字符串的第一个字母 *++argv[0]代表对argv[0]进行自增
21调用函数指针的时候可以这样
void qsort(void *linptr[],int left,int right,int (*comp)(void *, void *)); //原型 *comp如果不加括号的话 意思就是返回一个指向int的指针了
调用时候 qsort((void**) lineptr,0,nlines-1,int (*)(void*,void*))(numeric?numucmp:strcmp)); //其中 numucmp和strcmp是函数的地址 不需要加& 就像数组前一样 不用加
在函数内部使用的时候要加* 如( *comp)(v[i],v[left]) comp是一个指向一个有两个参数并返回int的函数 如果不加括号的话 意思就是返回一个指向int的指针了
22 任何指针可以转换为 void *类型 并在转回来的时候不会丢失信息(通常) 但是编译器可能会报错
23关于DCL 把c转成一个语言描述 如
dcl : optional *'s direct-dcl
direct-dcl name
(dcl)
direct-dcl()
direct-dcl[optional size]
如(*pfa[])()
pfa是一个name 也是一个d-dcl(我缩写下) pfa[]也是d-dcl ;*pfa[]则是一个dcl (*pfa[])又是一个d-dcl (*pfa[])()也是一个d-dcl
先丢这