概述
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; //访问数组中的元素
最后
以上就是无限方盒为你收集整理的C专家编程:第十章:再论指针的全部内容,希望文章能够帮你解决C专家编程:第十章:再论指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复