shi*_*bly 12 c arrays pointers
关于C中指针的使用,我有一些困惑/问题.我已经把下面的示例代码轻松地理解了.请注意这些代码的不同之处.如果您对它有一些问题,请收到反馈.
这不起作用.
#include <stdio.h>
#include <stdlib.h>
void process() {
int *arr;
arr=(int*)malloc(5*sizeof(int));
arr=(int*){3,1,4,5,2};
for(int z=0;z<5;z++) {
printf("%d ",arr[z]);
}
printf("\n");
}
int main() {
process();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这很有效.
#include <stdio.h>
#include <stdlib.h>
void process() {
int *arr;
arr=(int*)malloc(5*sizeof(int));
arr=(int[]){3,1,4,5,2};
for(int z=0;z<5;z++) {
printf("%d ",arr[z]);
}
printf("\n");
}
int main() {
process();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这也有效.为什么?我没有在这里分配内存.
#include <stdio.h>
#include <stdlib.h>
void process() {
int *arr;
arr=(int[]){3,1,4,5,2};
for(int z=0;z<5;z++) {
printf("%d ",arr[z]);
}
printf("\n");
}
int main() {
process();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
他们为什么不一样?
arr=(int*){3,1,4,5,2};
arr=(int[]){3,1,4,5,2};
Run Code Online (Sandbox Code Playgroud)
有没有其他方法来初始化整数指针数组,而不是在这种单独的分配方式中使用?
arr[0]=3;
arr[1]=1;
arr[2]=4;
arr[3]=5;
arr[4]=2;
Run Code Online (Sandbox Code Playgroud)
如何在指针的内存中获得分配的大小/数量,以便我可以使用像静态for(int z=0;z<NUM;z++) {而不是for(int z=0;z<5;z++) {静态的东西?
任何答案都非常感谢.
提前致谢.
malloc前几个示例中的调用分配一块内存并为该内存分配一个指针arr.一旦arr再次分配,指针值就会被覆盖,并且你已经忘记了分配的内存 - 也就是说,你已经泄露了它.那是一个错误.
换句话说,如果使用using分配内存块malloc(),则可以使用数组语法将数据写入其中(例如):
int* arr = (int *) malloc(sizeof(int) * 5);
for (int i=0; i<5; ++i)
arr[i] = i;
Run Code Online (Sandbox Code Playgroud)
但是你无法直接分配任何其他内容arr,或者你丢失了指向该内存块的指针.当您使用时分配块时malloc(),不要忘记在free()不再需要时使用它来删除它.
数组不是指向整数的指针; 这是一个阵列.将数组名称作为参数传递给接受指针作为参数的函数时,数组名称被称为"衰减到指针",但它们不是同一个东西.
关于你的上一个问题:这实际上是数组和指向类型的指针之间的区别:编译器知道数组的大小,但它不知道任意指向类型指向的块的大小.不幸的是,答案是否定的.
但是既然你在编写C++而不是C语言,那么你不应该使用数组:使用`std :: vector'!他们知道自己的长度,而且他们是可扩展的.
当您说:时ptr = {1,2,3,4,5},您ptr指向数据段中的内存,其中常量数组{1,2,3,4,5}驻留,因此您正在泄漏内存.如果要初始化内存,请在分配后写入:ptr[0]=1; ptr[1]=2;依此类推.如果要复制数据,请使用memcpy.