C指针这一章,花了好几天才复习完,每天看一个部分,慢慢消化理解,到今天总算翻到了小结这一页。看完之后,更多的感觉是不知所措,给我的感觉是不知道从何去总结指针这块知识。昨天的面试一道C指针的题做错了,更打击了我对这块知识理解的信心。
这里牵扯到很多细小的知识点,而且内容又很深,有的地方还很难理解。不管了,总之看完了,就以自己的方式和理解去总结一下其中的几个点吧,难免会有理解不到位或理解错误的地方。以后有时间再消化一下借的那本《C和指针》。
1.数组指针,即数组的指针,一个指针变量指向一个数组。
以一维数组来分析: int a[10],*p=a; 表示一个组数a,含有10个整型元素。编译器为这个数组分配一段内存,p的值就是这段内存的首地址,即指向这段数组的第一个整型数。p+1则指向这个数组的第二个整型数。
注意:此时p+1,跳了一个int长度。如开始p的值为2000,而int占两个字节,则p+1则为2002.
|
对于二维数组,情况就复杂的多了,涉及到行、列的关系 int a[3][4]={……}; 此二维数组有3行,应将其每一行看作为一个一维数组,即这个二维数组其实包括了3个一维数组,每个一维数组中又有4个元素. a代表整个二维数组的首地址。而a[0]表示第一行的首地址,也就是第一个一维数组的首地址。二者此时指向的是同一个地址,但是它们的意义不同。分别对其加1,区别就可以看出来了。如下: a+1 表示第二行的首地址,即a[1],跳过了一行。 而a[0]+1 表示第一行的第二个元素的地址。即它加1的时候可看作向旁边移动一格。 这样,行与列的关系就出来了。 接下来引入指针 int (*p)[n]; p则对应二维数组的中某一行。 例: int a[3][4]={……} int (*p)[4]; p=a 所以此时p是指向第一行首地址的,而p+1则会指向第二行首地址。
即*p=a[0],*(p+1)=a[1];这里的a[0]a[1]代表的是地址而不是数组内的元素值,即它表示一维数组名,也就是一维数组的首地址。
ps:只要时刻记住二维数组是看成多个一维数组组成的。
|
2.指针数组,即一个数组,里面装的元素都是指针。
int *p[4];即表示一个数组内装有4个元素,每个元素都是一个指向整型数据的指针变量。
用法:
char *name[]={"follow me","basic","great wall","fortran","computer design"};
则说明name[]数组中有5个元素,每个元素的值都分别为各字符串的首地址。此时若令
char **p;
p=name;
则要输出字符串时如下:
printf("%s\n",**p);
分析:p的值是name数组的首地址,name内的元素又是各字符串的地址,即*p即为name内元素的值,*p即为各字符串的首地址。那么这时要输出字符串,就得**p了。于是,这就引出了指针的指针。
|
3.函数指针,即指向函数的指针,函数名即为其首地址。可定义赋值如下:
int max(int,int); int (*p)(int,int);//可以看到这里*p相当于一个函数名。用括号括起来表示整体。
p=max;
|
4.指针函数,即一个函数的返回值为指针。
int *fun(int,int);
即这个函数返回一个指针。
如
void *malloc(unsigned int size);返回即为一个指针。
此时为void指针类型,必要时可用强制类型转换。如:
p=(char *) malloc(unsigned int size);
|
阅读(788) | 评论(0) | 转发(0) |