第10章 再论指针

用于实现多维数组的指针数组,必须用指向为字符串而分配的内存的指针进行初始化,即一次性用malloc分配整个x*y个数据的数组:

malloc(row_size * col_size * sizeof(char));

然后使用一个循环,用指针指向这块内存的各个区域。整个数组保证能够存储在连续的内存中,即按C用于分配静态数组的次序。

如果声明一个字符串指针数组,并根据需要为这些字符串分配内存,将会大大节省系统资源。有些人把它称为“锯齿状数组”是因为它右端的长度不一。可以通过用字符串指针填充向量来创建这种类型的数组,字符串指针可以直接使用现有的,也可以通过分配内存创建一份现有字符串的新鲜拷贝。例如:

char *turnip[SIZE];
char my_string[] = "your messages";
// 共享字符串
turnip[i] = &my_string[0];
// 拷贝字符串
turnip[j] = malloc(strlen(my_string) + 1);
strcpy(turnip[j], my_string);

只要有可能,尽量不要选择拷贝整个字符串的方法

在编译器中,数组的数组会被改写为数组的指针,而不是指针的指针。

在C语言中,任何一维数组均可作为函数的实参。形参被改写为指向数组第一个元素的指针,所以需要一个约定来提示数组的长度。一般有两种方法:
(1)增加一个额外参数,表示元素的个数(argc就是起这个作用)。
(2)赋予数组最后一个元素一个特殊值,提示它是数组的尾部(字符串结尾的’\0’),这个特殊值必须不会作为正常的元素值在数组中出现。
二维数组的情况要复杂一些,数组被改写为指向数组第一行的指针。现在需要两个约定,其中一个用于提示每行的结束,另一个用于提示所有行的结束。提示单行结束可以使用一维数组所用的两种方法,提示所有行结束也是如此。
我们能够采取的最好方法就是放弃传递二维数组,把array[x][y]这样的形式改写为一个一维数组array[x+1],它的元素类型是指向array[y]的指针。这样就改变了问题的性质。在数组最后的那个元素array[x+1]里存储一个NULL指针,提示数组的结束。
在C语言中,没有办法向函数传递一个普通的多维数组
你必须提供除了最左边一维以外的所有维的长度。这样就把实参限制为除最左边一维以外所有维都必须与形参匹配的数组。例如:

invert_in_place(int a[][3][5]);
// 其可接受如下调用
int b[10][3][5];
invert_in_place(b);

int c[999][3][5];
invert_in_place(c);

对多维数组作为参数传递的支持缺乏是C语言存在的一个内在限制。这使得用C语言编写某些特定类型的程序非常困难(如数值分析算法)

严格地说,无法直接从函数返回一个数组。因为不能从函数中返回一个指向函数的局部变量的指针。

在C语言中,数组是静态的,数组的长度在编译时便已确定不变。在这个领域,C语言的支持很弱,甚至不能使用以下形式:

const int limit = 100;
char plum[limit]; // 编译器提示错误

在C语言中实现动态数组,使用以下形式:

int size;
char *dynamic; // 为动态数组声明变量
dynamic = (char*)malloc(size);
dynamic[0] = 'a';

工程师所存在的问题是他们采取欺骗的手段来获得结果。
数学家所存在的问题是它们研究一些玩具性的问题来获得结果。
程序检验员所存在的问题是他们在玩具性问题上采取欺骗手段来获得结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值