指向数组的重点是什么?

Riv*_*asa 9 c arrays pointers

所以,我正在阅读有关指针的内容,并且遇到了指向数组的指针.问题是指向数组的指针根本不是真的有用,因为我可以直接获取元素,而不是使用指针来获取数组元素的偏移量.但是我觉得好像我错过了这些可能有用的原因.

所以,简而言之,指向数组的重点是什么; 如何以及为什么要使用它们,它们是否有任何实际应用?

编辑:我的意思是在普通/简单数组的上下文中,例如:

int array[5];
Run Code Online (Sandbox Code Playgroud)

编辑:正如Keith指出的那样,我特别询问指向数组的指针,例如char (*ptr)[42]指向42个元素的char数组的指针.

小智 11

不幸的是,你收到的一些答案显示了对C中指针和数组的误解,简而言之:

1)指向数组的指针与指向第一个元素的指针不同.

2)声明数组类型与声明指针不同.

您可以在C faq部分找到与指针和数组之间常见混淆相关的完整描述:http://c-faq.com/aryptr/index.html

解决您的问题 - 指向数组的指针有助于传递整个编译时已知大小的数组,并在参数传递期间保留有关其大小的信息.当你在某些数组的子数组上操作什么时处理多维数组时,它也很有用.


jxh*_*jxh 7

在大多数表达式中,类型为"T of array"的对象将降级为第一个数组元素的地址,该数组元素的类型为"指向T的指针".从这个意义上讲,指针类型可用于表示项目数组,并在需要动态分配数组时用于执行此操作.

// ptr used to dynamically allocate array [n] of T
T *ptr = malloc(n * sizeof(*ptr));
Run Code Online (Sandbox Code Playgroud)

在指向数组的指针的情况下,它可以用于表示数组的数组,和/或动态地分配数组的数组.因此,指向数组的指针可用于表示二维数组.

// ptr used to dynamically allocate 2 dimensional array [n][10] of T
T (*ptr)[10] = malloc(n * sizeof(*ptr));
Run Code Online (Sandbox Code Playgroud)


tab*_*tab 5

到目前为止尚未真正解决的数组的真指针是不常见的,因为数组在大多数上下文中衰减到指向它们的第一个元素的指针,并且因为数组在内存中是连续的,通常只需要所有这些.与其他指针类型相比,它们也有些不切实际,因为无法分配数组类型.在这方面,它们类似于函数指针.

最大的实际差异来自于它们在指针衰减(例如函数调用和返回)丢失的情况下保留数组的大小.以下面的代码为例

void function(char (*array)[10]) {
    for(size_t i = 0; i < sizeof(*a); i++);
        (*a)[i] = i;
}
...
char a[10];
function(&a);
Run Code Online (Sandbox Code Playgroud)

除了允许sizeof的这个应用程序(由于大小被称为参数的一部分,这不是非常有用),这将强制传递参数的确切大小作为类型的一部分function(char array[10]),即使使用也不会这样做[static 10].返回有一个不寻常的语法:

char (*function(void))[10] {
    static char array[10];
    // do something with our static array
    return &array;
}
char (*a)[10] = function();
// or even
char (*b)[sizeof(*function())] = function();
Run Code Online (Sandbox Code Playgroud)

我不认为我曾经在野外遇到过这种应用,但它至少是可能的(合法的).