1.Switch(dat)语句dat必须为整型或字符型表达式,不能为浮点型float
2.exit()退出程序,准确是结束一个进程,无返回值
3.单目运算符结合性为自右向左,&P++,*P++
4.(void *)0 == NULL;c语言中指针的大小为4个字节
5.printf(“%p\n”, &a); %p格式化输出指针地址
6.int a = 10;
const int *p1 = &a; // const修饰*p1,不能通过*p1方式改写指向的变量值,但是可以直接改写变量
int const *p2 = &a; // const修饰及作用同上一句
int *const p3 = &a; // const修饰p3,p3指针变量不能被改写
7.int a = 10;
Int **c; // 定义指向指针变量的指针变量c
Int *b = &a;
c = &b;
8.pb – pa的结果为5而不是20;表面看起来pb,pa存储的是实际地址,并且相减,但是语法规定其结果只能是所指向数据的间隔数。
若需要实际地址相减的话,则(int)pb– (int)pa,结果为实际地址间隔20
9.int a[5];
a = &a[0] = &a;
对数组名取地址的结果就是数组首元素的地址
对数组取地址,类型可以当做指向此种数组的指针来使用,这里没有确定说它是指针
(&a + 1)指向数组末尾
int a[5];
&a + 1; // 对数组名取地址表示该地址指向整个数组
*(*(&a + 1) - 1); // 指向a[4]
Static int a[5];
等价于:a[0] =0;a[1] = 0;a[2] = 0;a[3] = 0;a[4] = 0;
10.
使用scanf输入字符串时,输入遇到空格、tab、回车换行,则默认结束输入。
例如:输入“how areyou”,则输入遇到空格时已经结束输入了。
11.
对结构体中数组成员进行初始化时,需要使用strcpy,不能像这样stu.name= “Mike”;
12.
使用typedef命名struct类型名为DATE
Typedef struct
{
intmonth;
intday;
intyear;
}DATE;
可以使用DATE定义变量
DATE birthday;
DATE *p;
typedef int (*P)(int, int);
P p; // p表示int(*p)(int, int)
Typedef int ARRY[10];
ARRY arry; // arry表示int arry[10]
13.
int arr[]={6,7,8,9,10};
int * p = arr;
*(p++) += 123; // 执行本条语句后,*p = 7
// *p++ = *p++ +123; // 执行本条语句后,*p = 8
printf("%d, %d\n",*p,*(++p)); // 先执行*(++p),再执行*p
14.利用左右结合性,观察指针指向,例如:
int ( *(*F)(int,int) )(int);
(1)先找到指针变量;’F’。找到指针变量后,进来就一直往右,直到遇到’)’,才一直往左,若再次遇到’(’,则不往左,返回往右,再次遇到’)’时,不改变方向,继续往右
(2)往右遇到’)’,则往左看,’F’与’*’结合;表示’F’为指针变量
(3)继续往左看,遇到’(’,则返回往右看,遇到之前的’)’,继续往右看,与(int, int)结合;
表示’F’是指向函数的指针,该函数有2个int形参
(4)继续往右看,遇到’)’,则往左看,与’*’结合;表示’F’所指向的函数返回值为指针
(5)继续往左看,遇到’(’,则返回往右看,遇到之前的’)’,不改变方向,继续往右看,与(int)结合,右边没有了,则返回往左看,与int结合;表示’F’指向的函数的返回指针指向如int*fun(int)返回值为int,有1个int形参的函数。
例题:
(1) float(**def)[10];
(2) double* (*gh)[10];
(3) double(*f[10])();
(4) int* ((*b)[10]);
(5) long (*fun)(int);
答案:
(1) def是一个指针,它指向一个数组指针,而那个数组指针则指向一个有十个float变量的数组 。
(2)gh是一个指针,它指向一个一维数组,数组元素都是double*。
(3)f是一个数组,f有10个元素,元素都是指向函数的指针(即函数指针),指向的函数类型是没有参数且返回double的函数。
(4)就跟"int*(*b)[10]"是一样的,b是一个指向一维数组的指针。
(5)函数指针。