您的位置:首页 > 其它

二维数组与二级指针

2011-05-21 13:36 204 查看
今日在论坛上看到有人问到指针

的问题,我想通过这样的例子来阐述几个常见的错误,并加深对二
  级指针和二维数组

之间关系的理解.
  我们知道char array[]=”abcdef”; array是数组的首地址,
  那么在二维数组中array当然也是数组的首地址,
  看看这个定义char Array[][3] ={“ab“,“cd“,“ef“};
  怎么知道的呢?定义这样一个数组,在vc调试窗口中
  我们看到:
  Array ---------0x64324234
   |------Array[0]---0x64324234 “ab“
   |------Array[1]---0x64324337 “cd“
   |------Array[2]---0x6432433A “ef”
  已经很明白了,实际编译器是这样实现二维数组的,实际上Array是“一维

指针数组“的首地址,其中每一个元素

指针都
  对应一个字符串

,那么好我们来看看是否可以这样来使用Array二维数组.
  char **pArray = Array;编译器

提示出错,怎么办呢?加个(char **)试试,仍然出错,设断看一下pArray的值和Array
  的值是相等的,但我们是否可以象使用Array[i]那样来同样输出字符串呢?很明显是不行的,编译器不会把
  pArray+i处理成pArray+i*3寻找到第i个指针的地址,而只是简单的加了一个i.这说明编译器只做了很简单的将地址值赋给
  了pArray,而它实际没有任何意义.我们不能用它来访问任何数据.很奇怪吗?
  再来

看看这样定义char *p[] = {“ab“, “cd“, “ef“};定义了一个指针数组.char **sp = p;这样的用法

经常看到,为什么这样
  就可以使用sp[i]来访问字符串了呢,的确编译器在编译的时候识别出了sp是一个指向一维数组的指针的
  指针,那么我们就可以把它做为数组名来操纵整个数组了,c神奇的地方或者说精华的地方就在这里了,希望
  这篇文章对那些对指针或二级指针有疑惑的朋友能够有所帮助,这也是我blog里的第一篇文章,呵呵.

附:

采用指向指针的指针操作,一般用于在函数内部来改变采用指针方式传进函数的主函数的指什的指向

我们想在函数pro()中改变指针p的值(记住:是指针p的值,而不是p所指向的地址的值)。能实现吗?结果是不能,为什么?我们来分析一下
先看一个例子:

#include <stdio.h>
char buf[10] = "hello";

void pro(char *out)
{
out = buf;
}

void main()
{
char *p = NULL;

pro(p);
printf("%s/n", p);
}

我们想在函数pro()中改变指针p的值(记住:是指针p的值,而不是p所指向的地址的值)。能实现吗?结果是不能,为什么?我们来分析一下。

如果不用函数pro(),我们可以直接在主函数中用 p = buf 来实现。如果使用函数pro(),就变得稍微复杂了。因为我们要在函数pro()中改变指针p的值,而函数pro()又没有返回值,如何记住这个改变呢?

我们可以先用简单的例子说明:

#include <stdio.h>

void pro(char *out)
{
out[1] = 'o';
}

void main()
{
char *p = "hello";
pro(p);
printf("%s/n", p);
}

(注: 这个程序是错误的!!!
p指向的是存放在常数区的字符串"hello";
在函数pro却要去改写这个字符串,虽然编译能通过,但是是错误的 !!)

这个例子是改变了字符串指针p所指向的字符串的指,它能记住这个改变是因为在函数中是对指针所指向的地址空间进行操作。你明白了吗?也就是说,函数的参数是char *out,我们可以改变 *out,但改变不了out本身。

所以针对第一个例子,我们要想改变p,必须把&p当作参数传给函数pro()。修改后的例子如下:

 
#include <stdio.h>
char buf[10] = "hello";

void pro(char **out)
{
*out = buf;
}

main()
{
char *p = NULL;

pro(&p);
printf("%s/n", p);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: