如何用数字初始化 char 类型的全局一维数组?
Posted
技术标签:
【中文标题】如何用数字初始化 char 类型的全局一维数组?【英文标题】:How can I Initialize a global 1D array of type char with a number? 【发布时间】:2022-01-17 20:08:21 【问题描述】:使用您的 ID(5 位数字)初始化一个 char 类型的全局一维数组“StudentData”。 在本部分中必须使用指针语法。 你能给我一些关于这样做的提示吗?
我试过这样做,
char *StudentData;
void loadData()
StudentData=(char*)"60897";
是正确的还是我应该尝试做其他事情?
【问题讨论】:
char *StudentData
是一个指针,而不是一个数组。 “这部分必须使用指针语法。”那么你想要一个数组还是一个指针?你需要选择一个。数据应该是读/写还是只读?
不需要演员表。除此之外,请记住,C 中的所有文字字符串实际上都是字符数组(包括空终止符),并且虽然这些数组不是常量,但您不能修改它们的内容。这就是为什么建议使用 const char *
来指向文字字符串的原因。
至于数组与指针的关系,您还必须记住(或了解)所有数组都可以衰减到指向其第一个元素的指针。并且对于所有数组和指针,数组索引将使用指针算法完成(对于任何数组或指针p
和索引i
,表达式p[i]
完全等于*(p + i)
)。
@Someprogrammerdude 在所有 C 语言中,隐式指针衰减是我认为的一个设计缺陷。它不会使开发变得更糟,实际上稍微容易一些,但它使学习语言变得更加困难。这不值得。
【参考方案1】:
您可能想要以下内容:
#include <string.h> //This header has strcpy()
#define ENOUGH_DIGITS 5 //This is so you can easily modify ID length in the future
char StudentData[ENOUGH_DIGITS+1]; //Global array 1 bigger than the longest string
void loadData()
//Ask the compiler to put a read-only string somewhere in the data memory
const char *myID = "60897";
//Copy the read-only string into the global array
strcpy(StudentData,myID);
【讨论】:
【参考方案2】:虽然您确实使用了一个数组(字符串文字实际上是一个),但它是一个匿名 - 而您的studentData
只是一个指向该数组的指针。
一个全局一维数组“StudentData”
我宁愿将其解释为您打算拥有一个具有该名称的真正数组,因此看起来像:
char studentData[N];
其中N
是一个常量表达式,表示您的数组的适当大小,至少为 5,因为您需要能够存储 5 位数字 - 如果您的 ID 应该表示为 C 字符串,则可能为 6(这样需要一个额外的字符持有强制性的空终止符!),或者你立即使用 2 的幂(最少 8 个)。
这部分必须使用指针语法。
所以你需要一个指向该数组的指针:
char* ptr = studentData;
您现在可以只使用指针将值分配给:
*ptr++ = '0'; // dereferences the pointer, assigns a value to (in this
// case a character representing the digit zero) and
// increments it afterwards to point to the next character
// repeat this for the next four digits!
*ptr++ = 0; // terminating null character (note: no single quotes)
// or:
*ptr = 0;
// it's up to you to decide if incrementing yet another time actually
// is meaningful (first variant) or unnecessary (second variant)...
如果没有进一步的要求,您可以将这段代码直接放在 main
函数中,或者将它放在另一个从 main
调用的函数中,例如:
void loadData(size_t size, char data[size])
// ideally size check with appropriate error handling
// assignment as above
// in main:
loadData(sizeof(studentData), studentData);
注意:对于 函数参数,所有 char* data
、char data[]
或 char[someArbitrarySize]
都是等效的,如果给定任何大小,它就会被忽略——我们仍然可以添加它以用于文档目的,在上面的签名中:告诉我们需要一个大小为(至少)size
的数组。还要注意,如果给定多个维度,这仅适用于 最外层 维度!
【讨论】:
【参考方案3】:一维数组“学生数据”
不不不。 StudentData
不是一个数组,它是一个指针。数组是内存块,而指针是内存地址,它可能是也可能不是数组。数组有时会变成指针,这叫衰减。
"60897"
已经与char *
兼容。您可以直接将其分配给StudentData
。像这样:
StudentData = "60897";
如果要使用数组,请执行以下操作:
#include <string.h>
char StudentData[WHATEVER_IS_ENOUGH_TO_HOLD_THE_DATA]; /* allocate array.
make sure that the size of the array accounts for the null
terminating character. */
void loadData()
strcpy(StudentData, "60897"); //you can't directly assign to an array.
【讨论】:
以上是关于如何用数字初始化 char 类型的全局一维数组?的主要内容,如果未能解决你的问题,请参考以下文章