我是C指针的新手,我来自Java / C ++。我试图将char * c附加到char ** cArray。这是我到目前为止的一点:
char **cArray = "abc";
char *c = "def";
cArray += &c;
printf("%s", cArray)
输出应为:abcdef
我的问题是,如何在C中将char *附加到char **? 感谢您提供的任何提示!
答案 0 :(得分:1)
您似乎对指针和数组的含义存在误解。首先让我们从一个数组开始。数组是一个连续的固定大小的内存块。也就是说,数组是彼此相邻的常数个值。
因此,首先,“追加”数组的想法对于将项目添加到数组中的下一个空白点的方式是有意义的。但是说阵列正在增长是不对的。数组不等同于Java的数组列表。
最后,我将指出静态数组是用:
声明的int val[3];
其中3
可以是任何其他常量值,解释为size_t。
接下来,让我们讨论指针。指针不是数组,不要混淆两者 - 虽然很多人觉得将它们视为可互换是令人欣慰的(大多数情况下你可以侥幸逃脱!)。然而,这是他们不是的情况之一。什么是指针?
指针表示内存中值的位置。因此,指针可以将指向指向我们上面创建的val
数组中的元素。如果我们创建了一个指向我们val
数组中每个元素的指针,并且我们将它们全部打印到stdout
,我们会看到它们彼此相距4个字节。这是因为数组的值彼此相邻(在内存中连续),而sizeof(int)
将返回4(在我的系统上)。
您的主要误解似乎是指针需要指向任何。他们不。就像你可以拥有一个没有信息的值(或者所有的位都设置为0),你肯定会有一个指向任何地方的指针。事实上,这正是你所做的。
char **cArray = "abc";
char *c = "def";
cArray += &c;
printf("%s", cArray);
好的,让我们逐行分开。首先,您声明名为char **
的{{1}}并将其初始化为cArray
。好吧,你的变量"abc"
是一个指向指针的指针。我认为值cArray
是"abc"
。因此,您可能不希望将指向字符的指针指定为指针的指针。结果是,值const char*
将被解释为另一个内存地址。显然,这不会指向任何有用的东西,访问这个内存会导致seg错误。
接下来,您将"abc\0"
初始化为包含c
的cstring。
最后,您将"def"
的地址指向增加地址cArray
。现在,"def"
根本不再指向cArray
(永远不要错误地解释它)。
然后我们尝试打印"abc"
指向的一些内存块,它们甚至不会远离我们程序想要触及的任何位。
所有这些都说,我说我有两个cstrings,我想得到第三个,这是第一个附加到第二个:
cArray