我注意到指针是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
有人可以为我澄清这个吗?
答案 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));
^^^^^ ^^^^^