整数指针数组?或指向一组int的指针?

时间:2017-06-22 11:27:13

标签: c arrays pointers

我注意到指针是4个字节,而int是2个字节。当我做出声明如:

<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>activemq-kahadb-store</artifactId>
</dependency>
是的,我宣布了一个由50个指针组成的数组?我以为我正在声明一个指向整数数组的指针,它在功能上与

相同
int * myGreatArray[50];

但是,本教程告诉我,这样的声明实际上是在创建一个指向int的指针数组,这似乎比仅仅存储int本身效率低。

https://www.tutorialspoint.com/cprogramming/c_array_of_pointers.htm

有人可以为我澄清这个吗?

5 个答案:

答案 0 :(得分:3)

这是运营商的优先权问题。

int * myGreatArray[50]; // array of 50 pointers to int
int (*ptArray)[50];     // pointer to array of 50 ints

答案 1 :(得分:2)

int * myGreatArray[50];

确实创建了一个指向int的指针数组。如果你想要一个指向int数组的指针,它将被写为

int (*myGreatArray)[50];
  

但是,本教程告诉我,这样的声明实际上是在创建一个指向int的指针数组,这似乎比仅仅存储int本身效率低。

取决于你想要做什么。它对于创建&#34;锯齿状的&#34;非常有用。 2D数组,其中每个&#34;行&#34;可以是不同的长度:

for ( size_t i = 0; i < 50; i++ )
  myGreatArray[i] = malloc( sizeof *myGreatArray[i] * some_length(i) );

其中some_length(i)表示特定&#34;行&#34;的元素数量。它还可以用于指向现有数组:

int foo[] = {1, 2, 3};
int bar[] = {4, 5, 6, 7, 8};
...
int *myGreatArray[] = {foo, bar, ...};

答案 2 :(得分:1)

撰写本声明时:

int * myGreatArray[50];

与写作相同 -

int ** myGreatArray = malloc(50 * sizeof(int *));

你将得到一个包含50个指向int的数组,如果你将使用这一行:

int myGreatArray[50];

或:

int* myGreatArray = (int*)malloc(sizeof(int)*50)

你将得到一个包含50个int变量的数组。 我希望我的评论对你有帮助:D 如果你还有问题,我会尽快回答你。 祝你有美好的一天;)

答案 3 :(得分:1)

声明一个数组:

int * myGreatArray[50];

这是一个存储50个指针int的数组。请注意,它不会为这些整数分配存储空间,只是为了存储指针。

int arr[50];       //array of 50 integers
int * parr = arr;  /*pointer to an int, which may be
                     the beginning of an array*/

传递给函数:

  

这正是我希望我发现的,所以当将数组传递给函数时,将指针传递给数组与指针数组相比是否更有效?我想是的。 - 迈克尔哈克曼

两个函数定义:

void doStuffToArray(int ** array, size_t len)
{
  //dostuff
}

void doStuffToArray(int * array[], size_t len)
{
  //dostuff
}

在功能上是相同的。传递数组时,函数实际上会收到一个指向数组的指针。

要调用这些函数,可以传递数组(转换为指向数组开头的指针,(推荐)或指向数组开头的指针(不推荐< / em>对于完整数组,但对于将指针传递给数组的部分很有用):

int arr[10] = {};
doStuffToArray(arr,     sizeof(arr)/sizeof(arr[0])); //functionally identical
doStuffToArray(&arr[0], sizeof(arr)/sizeof(arr[0])); //functionally identical

当传递指针数组时,可以使用两个函数定义,例如: argv是一个指向char数组的指针数组:

int main(int argc, char * argv[]){return 0;} //functionally identical
int main(int argc, char ** argv ){return 0;} //functionally identical

我的建议是使用数组表示法(使用[]),因为这是一个意图声明,而不是等效但更模糊的指针表示法。

如果你知道数组有多大,那么argv就可以被定义为数组的数组&#39; char argv[][]这将是伟大的,但无法完成。定义函数时,只能定义第一个数组维,必须定义任何其他维。如果你知道它有多大,那么没有什么可以阻止你创建一个函数:

void doStuffToMyArray( int array[][10]){
    /*...*/
}

答案 4 :(得分:0)

实际上在这次电话会议中

malloc(50 * sizeof(int));

没有分配数组。:)分配了一定程度的内存。您可以通过各种方式解释它。

例如,你可以写

int *myGreatArray =  malloc(50 * sizeof(int));

char *myGreatArray =  malloc(50 * sizeof(int));

甚至喜欢

long *myGreatArray =  malloc(50 * sizeof(int));

前提是sizeof( long )等于2 * sizeof( int )

或喜欢

int ( *myGreatArray )[50] =  malloc(50 * sizeof(int));

唯一的要求是为你要存储的对象分配了足够的内存。

如果要为类似于此声明的数组动态分配内存范围

int * myGreatArray[50];

然后你应该写

int ** myGreatArray = malloc(50 * sizeof(int *));
^^^^^^                                   ^^^^^

如果要为类似于此声明的数组动态分配内存范围

int myGreatArray[50];

这是一个包含50个int类型对象的数组,那么你应该写

int * myGreatArray = malloc(50 * sizeof(int));
^^^^^                                   ^^^^^