在下面的结构中,数组与指向字符的指针相比有什么好处:
struct my_struct {
int p;
char s[10];
};
或
struct my_struct {
int p;
const char *s;
};
我看到的一个优点是,使用char*
更容易区分“未提供字符串”和“提供空字符串”,而且它比数组占用更少的空间。
此外,在这两种情况下,我可以初始化:
构造my_structp{. p=10,. s="abcd"};
另一方面,我不能轻易地在char*
上使用strncpy()
,它必须是分配内存上的有效指针。
那么,还有什么好处呢?
而且它比数组占用的空间更小。
事实并非如此,因为你无论如何都要指向一些数据。假设您指向一个大小相同的缓冲区,那么最终总共会得到sizeof(void*)sizeof(char[10])
。
此外,在这两种情况下,我可以初始化:
struct my_struct p { .p = 10, .s = "abcd" };
是的,因为编译器正在内存中设置文本字符串,并将s
成员指向它。在本例中,您总共使用了sizeof(void*)sizeof(char[5])
字节。
我不能轻易地在char*上使用strncpy(),它必须是分配内存上的有效指针。
不,在这两种情况下都可以使用strncpy()
。
关于你应该使用什么:选择并不是关于优点和缺点。相反,你应该使用你需要的任何东西。例如,如果您事先不知道数组的最大大小,那么您别无选择,只能使用指针方法。如果你确实知道,那么你可以使用这两种方法;但是阵列1将更易于维护。
性能方面的考虑也会影响你的决定。例如,假设您对结构的多个实例进行操作,这取决于您如何访问结构,以及您用来保存实例的数据结构类型,即对数据的访问模式。很多时候,嵌入式阵列的速度更快,但并不总是如此。
让我试着简单地解释一下:
数组使用起来更简单,但操作起来更难。
指针可以很容易地释放已经为char*
分配的空间,并分配新的空间,从而具有更大的灵活性。让我们看一个例子:
int cnt = 0; // holds number of characters enterd
char c = 0;
while (cnt != -1) {
printf("Enter number of characters in next word: ");
cnt = getint();
printf("Enter the word: ");
char *word = malloc((cnt + 1) * sizeof(char));
int i = 0;
char c = 0;
for (;i < cnt; ++i) {
*(word + i) = c; // *(word + i) is technically the same as word[i]
}
*(word + i) = '\0';
free (word);
}
在上面的例子中,您可以在给定的时间分配所需的空间,这是数组无法做到的。
所以,如果你正在制作英语词典,使用数组,你需要立即分配45个字符,即使平均单词长度是5到6个字符。
把它应用到你的案子上
struct my_struct {
int p;
char s[10];
};
在程序开始时最多需要10个字符。如果你输入2个字符,你基本上就浪费了8个字符。在哪里
struct my_struct {
int p;
char *s;
};
您可以调用malloc()
您可以分配1个字符,它将容纳1个字符,完全没有浪费空间,您可以分配100个字符,它将容纳100个字符。所有这一切都将在进行中。
优点和缺点取决于你的算法和你试图实现的目标,没有简单的答案。可以这样说:
如果结构有一个char
数组(这只是我的观点):
优点
>
不需要为它分配内存,不需要检查malloc
是否失败,也不需要事后释放内存
对于您的结构的对象,不需要照顾指针的情况下,您必须取消引用之前写入操作/分配内存之前读取操作。
您可以使用字符串文字来初始化它,然后您可以更改内容。
缺点
如果结构有char
指针:
优点
>
你可以更自由地使用指针,你可以根据需要分配和重新分配内存。
您可以将指针指定给其他char
数组,而无需进行分配
您的结构尺寸较小,需要的内存较少。当您不为结构动态分配内存时,这很好。
缺点
>
你需要自己做内存管理,这取决于你的设计,这会消耗你大量的时间,直到你做对为止
如果你打算发送/写入对象到网络或硬盘驱动器,你需要照顾取消引用的指针,你不能做f↑(obj, n, sizeof*obj, fp)
,你必须做很多步骤。
如果指定了字符串文字,则必须小心以后不要修改它。修改字符串文字是一种未定义的行为,在大多数系统中,您会立即得到一个segfault。
总的来说,考虑一下你自己软件的设计和你的需求,然后你可以权衡利弊,使用最适合你项目的软件。
我不能轻易地在char*
上使用strncpy()
,它必须是分配内存上的有效指针。
这只是部分正确,一旦分配了内存,就可以使用strncpy
。
此外,在这两种情况下,我可以初始化:
struct my_struct p { .p = 10, .s = "abcd" };
是的,但是在数组的情况下,数组将被字符串文本的内容填充,并且可以在以后进行修改。在指针的情况下,它将指向字符串文本,就像我之前所说的,如果算法需要修改内容,那么就不能使用字符串文本。
主要内容:到底使用字符数组还是字符串常量C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《 C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下: 运行结果: https://www.xnip.cn https://www.xnip.cn 字符数组归根结底还是一个数组,上节讲到的关于 指针和数组的规则同样也适用于字符数组。更改上面的代码,使用指针的方式来输出字符串: 运行结果: https://ww
我刚刚开始学习C语言,一直在阅读K.N.King关于编程语言的教科书。在关于字符串的一章中,他指出字符数组和字符指针在传递到函数方面几乎是一样的。然而,它们是不可互换的,这背后的原因之一是,可以修改字符数组中的字符,而字符指针指向字符串文字。然而,在他的早期教科书中,他指出C无论如何都会将字符串文本存储为一个字符数组,所以这不会使字符指针和字符数组相同吗? 提前谢谢!
主要内容:关于数组指针的谜题数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以 为例,该数组在内存中的分布如下图所示: 定义数组时,要给出数组名和数组长度,数组名可以认为是一个 指针,它指向数组的第 0 个元素。 在C语言中,我们将第 0 个元素的地址称为数组的首地址。以上面的数组为例,下图是 arr 的指向:
问题1。数组名不是指向数组开头的指针吗??如果是这样,那么为什么sizeof运算符在上述代码中计算为两个不同的值。 i、 e为什么产生8,而产生12,即使它们都指向一个字符。 为什么在第二种情况下打印数组的大小? 这个问题看起来像是这个问题的复制品,但它不能回答我的问题。
指针概述 指针的概念 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,例如int型占4个内存单元,char型占1个内存单元。为了正确地访问这些内存单元,必须为每个内存单元编上号,根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地
问题内容: 有没有机会从以字符串表示的函数名称中获取指向函数的指针?例如,这需要将某些函数作为参数发送给另一个函数。您知道某种元编程。 问题答案: Go函数是一等值。您无需恢复动态语言中的技巧。 操场 输出: 如果函数的选择取决于某些仅在运行时已知的值,则可以使用映射: