Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
二维数组和指针-C_C_Arrays_Pointers - Fatal编程技术网

二维数组和指针-C

二维数组和指针-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

我只是想弄清楚C语言中的数组和指针以及它们之间的区别,但是我在使用2d数组时遇到了一些麻烦

对于普通的1D阵列,这是我学到的:

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[]
vs
char*
。同样的事情可以扩展到
char*[]
vs
char**

指针(
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中甚至被弃用。严格来说,您可以使用
{…}
作为标量的初始值设定项。在C
intx={5}
中是完全合法的。编译器抱怨初始值设定项过多。虽然OP的问题不是关于这个。。。
char **arr_pointer;
char *arr_pointer[];