1.int**p的含义:*p表示这是一个指针,int*表示它指向的类型是int型的指针
2.*在打印或赋值时表示解引用,(向右对应),如**p,为*p的解引用指向某个指针,再进行解引用得到确定的值
3.指针数组的应用:用一维数组模拟二维数组的实现
4.字符串指针:如char *p="abcd";意为把首字符的地址存放在p中(如果报错改为const char *p="abcd")
5.字符串可以看作一个字符数组,如“abcd”[3]的结果为d,字符串在式子里以首字符地址存在
7.
辨析:为什么str1和str2不相等,其实很简单,字符串在式子中以首字符地址存在,那么如果a=0,b=0,难道a,b的地址一样吗?其实是一个道理。那为什么str3与str4相等?由于这两个指针指向的是字符型常量,且为同一个,当然在一个内存空间中,所有字符串首字符的地址是相等的。
8.字符指针:指向字符的指针,字符指针变量存放着字符的地址
9.&arr取出的是数组的地址,arr是数组首字母的地址
10.如何确定一个变量的类型:去掉变量名字留下的就是类型
11.数组指针的一般使用方法:
12.一维数组的传参可以是指针也可以是数组,因为传进去的其实是首元素地址
13.二维数组(元素为一维数组的数组,首元素为第一行的地址)传参形参写成数组也可以写成指针,因为传进去的其实是第一行的地址,如arr[3][5]的传入形式为int (*arr)[3]
14.重新理解*(*(arr+i)+j):首先arr代表二维数组第一行的地址,加i使a指向第i行的地址,由于arr+i表示的是一个指向第i行数据地址的指针,所以使用*解引用对这一行的地址进行释放,然后+j表示将这行第j个元素的地址取出来,最后加*进行解引用
15.对比:arr为数组首元素的地址,&arr为数组的地址,constructor和&constructor都为函数的地址
int ADD(int a,int b)
{}
int a=0;
int arr[5]={0};
int *pa=&a;//元素指针
int (*pb)[5]=&arr;//数组指针
int (*pc)(int ,int)=&ADD//函数指针
所以想要调用函数也可以是以下形式:(*pc)(2,1);也可以是(pc)(2,1),但为了增强可读性建议采用第一种方法
16.指向指针函数的指针:
char*ADD(int a,char b)
{
return NULL;
}
char*(*pa)(int ,char)=&ADD
17.运用剥洋葱方法解题*((void(*)())0)():首先,void(*)()为一个函数指针类,可由上文h函数指针结构得出,而()0为将0的类型强制转化为函数指针类,然后进行解引用得到一个函数,而最后的括号是函数体的一部分
18.重命名:typedef unsighed int good写在主函数外表示将unsighed int类型重命名为good类型,而数组指针类型int(*p)[10]可以写成 typedef int(*good)[10[,在主函数就可以用good来代替这个类型了,对于函数指针数组指针代替变量写法要写在原变量所在的位置