当前位置: 首页 > 知识库问答 >
问题:

指向字符或字符数组的指针[重复]

贡斌
2023-03-14

在下面的结构中,数组与指向字符的指针相比有什么好处:

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(),它必须是分配内存上的有效指针。

那么,还有什么好处呢?

共有3个答案

阚砚文
2023-03-14

而且它比数组占用的空间更小。

事实并非如此,因为你无论如何都要指向一些数据。假设您指向一个大小相同的缓冲区,那么最终总共会得到sizeof(void*)sizeof(char[10])

此外,在这两种情况下,我可以初始化:

struct my_struct p { .p = 10, .s = "abcd" };

是的,因为编译器正在内存中设置文本字符串,并将s成员指向它。在本例中,您总共使用了sizeof(void*)sizeof(char[5])字节。

我不能轻易地在char*上使用strncpy(),它必须是分配内存上的有效指针。

不,在这两种情况下都可以使用strncpy()

关于你应该使用什么:选择并不是关于优点和缺点。相反,你应该使用你需要的任何东西。例如,如果您事先不知道数组的最大大小,那么您别无选择,只能使用指针方法。如果你确实知道,那么你可以使用这两种方法;但是阵列1将更易于维护。

性能方面的考虑也会影响你的决定。例如,假设您对结构的多个实例进行操作,这取决于您如何访问结构,以及您用来保存实例的数据结构类型,即对数据的访问模式。很多时候,嵌入式阵列的速度更快,但并不总是如此。

程赞
2023-03-14

让我试着简单地解释一下:

数组使用起来更简单,但操作起来更难。

指针可以很容易地释放已经为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个字符。所有这一切都将在进行中。

西门淮晨
2023-03-14

优点和缺点取决于你的算法和你试图实现的目标,没有简单的答案。可以这样说:

如果结构有一个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函数是一等值。您无需恢复动态语言中的技巧。 操场 输出: 如果函数的选择取决于某些仅在运行时已知的值,则可以使用映射: