二维数组和指针-C
我只是想弄清楚C语言中的数组和指针以及它们之间的区别,但是我在使用2d数组时遇到了一些麻烦 对于普通的1D阵列,这是我学到的:二维数组和指针-C,c,arrays,pointers,C,Arrays,Pointers,我只是想弄清楚C语言中的数组和指针以及它们之间的区别,但是我在使用2d数组时遇到了一些麻烦 对于普通的1D阵列,这是我学到的: char arr[] = "String constant"; 创建一个字符数组,变量arr将始终表示初始化时创建的内存 char *arr = "String constant"; 创建指向char的指针,该指针当前指向char数组“String constant”的第一个索引。指针稍后可以指向其他地方 char *point_arr[] = { "one
char arr[] = "String constant";
创建一个字符数组,变量arr
将始终表示初始化时创建的内存
char *arr = "String constant";
创建指向char的指针,该指针当前指向char数组“String constant”的第一个索引。指针稍后可以指向其他地方
char *point_arr[] = {
"one", "two","three", "four"
};
创建一个指针数组,然后指向字符数组“1”、“2”等
我的问题
如果我们可以同时使用:
char *arr = "constant";
及
那么为什么我不能使用:
char **pointer_arr = {
"one", "two", "three", "four"
};
而不是
char *pointer_arr[] = {
"one", "two", "three", "four"
};
如果我尝试char**
的方法,那么我会得到一个类似“标量初始值设定项中的元素过多”的错误。我可以通过使用calloc
专门分配内存来让char**
示例工作,但我不必使用char*arr=“blah>来这样做";代码>。我不明白为什么有必要这样做,因此我不太理解以下两者之间的区别:
char **arr_pointer;
及
非常感谢您的建议。简而言之,您不能将{…}
用作标量的初始化器
char**arr\u指针
声明标量,而不是数组。相反,您可以执行以下操作的原因是char*arr=“constant”代码>是因为您仍在声明标量,它恰好指向字符串文字。请参阅:
这里解释了char[]
vschar*
。同样的事情可以扩展到char*[]
vschar**
指针(char*pointer;
)具有值;数组(char数组[];
)包含元素
声明char**ptr2
声明了一个可以接受单个值的对象,而不是一个可以接受多个元素的对象。引用维基百科:
在计算中,标量变量或字段一次只能保存一个值。。。例如,char、int、float和double是C编程语言中最常见的标量数据类型
正如Oli Charlesworth在他的回复中指出的那样,使用{…}初始化多个项目,但由于char**arru指针是一个“标量”,因此一次只能指向一个东西(一个地址),那么{…}符号在这里不起作用。如果你真的想了解它的底部,那么试着通过int而不是char来理解数组和指针。根据我的经验,当涉及字符时,我很难理解指针和数组。一旦你正确地理解了ints,你就会意识到它根本不存在差异
int*ptr[]是指向整数的指针数组,其中as int**ptr是指向引用整数的指针的指针
int*arrptrs[2]
arrptrs[0]=(int*)malloc(sizeof(int)*5)
arrptrs[1]=(int*)malloc(sizeof(int)5)
这将初始化由数组arrptrs的元素引用的两个数组。数组的名称是指数组的第一个元素的内存位置,因此arrptrs的类型为(int*),因为此数组的第一个元素的类型为(int*)
假设我们这样做
int**ptr=arrptrs
那么,
*ptr是arrptrs的第一个元素,它是arrptrs[0],而*(ptr+1)是arrptrs[1],执行*arrptrs[0]是arrptrs[0]引用的数组中的第一个元素
虽然我不确定您是否需要它,但我希望这会有所帮助。我相当确定这是一个重复的例子……在一个稍微相关的注释中,第二、第三和第四个例子应该是const
@Matteo:const
,因为字符串文字是很好的样式,但在C中不是必需的。@schot:它不是必需的,但是IIRC字符串文本的const char*
到char*
隐式转换只是出于兼容性的原因,而且可能(我不确定)在C99中甚至被弃用。严格来说,您可以使用{…}
作为标量的初始值设定项。在Cintx={5}
中是完全合法的。编译器抱怨初始值设定项过多。虽然OP的问题不是关于这个。。。
char **arr_pointer;
char *arr_pointer[];