C专家编程:第十章:再论指针

1、在锯齿状数组上使用指针可以节省空间:

如果声明一个字符串指针数组,并根据需要为这些字符串分配内存,将会大大节省资源,因为它左右端长度不以所以叫“锯齿状数组”。

char carrot[50][256];  用于存储50个字符串,浪费空间。

可改为指针数组:

char  *turnip[50];

charmy_string[ ] = "your message here";

turnip[i] =&my_string[0];

2、数组和指针是如何被编译器改编的:

实参

所匹配的形式参数

数组的数组                char c[8][10];

char (*)[10];              数组指针

指针数组                  char *c[15];

char **c;                   指针的指针

数组指针(行指针) char (*c)[64];

char (*c)[64];            不改变

指针的指针               char **c;

char **c;                  不改变

main() 函数中能看到char **argv 这样的参数,是因为 argv 是个指针数组(即char *argv[ ])。这个表达式被编译器改写为指向数组第一个元素的指针,也就是一个指向指针的指针。如果 argv 参数事实上被声明为一个数组的数组(也就是 charargv[10][15]),它将被编译器改写为 char (*argv)[15] (也就是一个字符数组指针),而不是 char **argv。

3、在C语言中,没有办法向函数传递一个普通的多维数组:

这是因为我们需要知道每一维的长度,以便为地址运算提供正确的单位长度。在C语言中,我们没有办法在实参和形参之间交流这种数据(它在每次调用时会改变)。因此,必须提供除了最左边一维以外的所有维的长度。这样就把实参限制为除最左边一维外所有维都必须与形参匹配的数组。

4、使用指针从函数返回一个数组:

1)

int (*paf( ))[20];        //函数声明

int (*paf( ))[20]      //paf是一个函数,包含20个int元素的数组的指针

{

int (*pear)[20];       //声明一个指向包含20个int元素的数组的指针

pear = calloc(20, sizeof(int));

if(!pear)  

longjmp(error, 1);

return pear;

}

这样调用:

int (*result)[20];

result = paf();

(*result)[3] = 12;      //访问结果函数

2)

struct a_tag{

int array[20];

} x, y;

struct a_tag my_function()   {   …….  return y}

这样使用:

x = y;

x = my_function();

x.array[i] = 38;       //访问数组中的元素

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值