几个星期前,我开始学习编程语言C.我对网络技术有所了解,如HMTL/CSS,Javscript,PHP和基本服务器管理,但C让我感到困惑.据我所知,C语言没有字符串的数据类型,只有字符,但是我可能错了.
我听说有两种声明字符串的方法.声明字符串的这两行之间有什么区别:
a.)char stringName[];
b.)char *stringName;
我得到的char stringName[];
是一个字符数组.但是,第二行让我感到困惑.据我所知,第二行是一个指针变量.是不是指针变量应该是另一个变量的内存地址?
在C语言中,正如您所说,"字符串"是一个数组char
.C规范中内置的大多数字符串函数都希望字符串为"NUL终止",这意味着char
字符串的最后一个是a 0
.不是代表数字零的代码,而是代表的实际值0
.
例如,如果您的平台使用ASCII,则以下"字符串"为"ABC":
char myString[4] = {65, 66, 67, 0};
当您使用char varName[] = "foo"
语法时,您将在堆栈上分配字符串(或者如果它在全局空间中,您将全局分配,但不是动态分配.)
C语言中的内存管理比您可能遇到的许多其他语言更加手动.特别是,存在"指针"的概念.
char *myString = "ABC"; /* Points to a string somewhere in memory, the compiler puts somewhere. */
现在,a char *
是"指向char或char数组的地址".请注意该声明中的"或",程序员必须知道具体情况.
确保您执行的任何字符串操作都不超过您为指针分配的内存量也很重要.
char myString[5]; strcpy(myString, "12345"); /* copy "12345" into myString. * On no! I've forgot space for my nul terminator and * have overwritten some memory I don't own. */
"12345"实际上是6个字符长(不要忘记0
在最后),但我只保留了5个字符.这就是所谓的"缓冲区溢出",并且是许多严重错误的原因.
"[]"和"*"之间的另一个区别是,正在创建一个数组(正如您猜测的那样).另一个不是保留任何空间(除了保持指针本身的空间.)这意味着直到你指出它知道有效的地方,不应该使用指针的值来读或写.
另一点(由评论中的某人制作)
您不能将数组作为参数传递给C中的函数.尝试时,它会自动转换为指针.这就是为什么我们将指针传递给字符串而不是字符串本身