Chinaunix首页 | 论坛 | 博客
  • 博客访问: 452215
  • 博文数量: 72
  • 博客积分: 3186
  • 博客等级: 中校
  • 技术积分: 1039
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-07 16:53
文章分类

全部博文(72)

文章存档

2012年(1)

2011年(5)

2010年(10)

2009年(56)

我的朋友

分类: C/C++

2009-03-14 22:30:53

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) |
给主人留下些什么吧!~~