我试图理解C中的指针,但我目前对以下内容感到困惑:
Char *p = "hello" 这是一个指向字符数组的char指针,从h开始。 Char p[] = "hello" 这是一个存储hello的数组。
当我把这两个变量都传递给这个函数时,有什么不同?
void printSomething(char *p)
{
printf("p: %s",p);
}
我试图理解C中的指针,但我目前对以下内容感到困惑:
Char *p = "hello" 这是一个指向字符数组的char指针,从h开始。 Char p[] = "hello" 这是一个存储hello的数组。
当我把这两个变量都传递给这个函数时,有什么不同?
void printSomething(char *p)
{
printf("p: %s",p);
}
当前回答
Char p[3] = "hello" ?应该是char p[6] = "hello"记住在C语言的"string"结尾有一个'\0'字符。
不管怎样,数组在C语言中只是指向内存中调整对象的第一个对象的指针。唯一不同的是语义。虽然可以将指针的值更改为指向内存中的不同位置,但创建后的数组将始终指向相同的位置。 此外,当使用数组时,“新建”和“删除”会自动为你完成。
其他回答
对于这样的情况,效果是相同的:您最终传递字符串中第一个字符的地址。
声明显然是不一样的。
下面的代码为字符串和字符指针预留内存,然后将指针初始化为指向字符串中的第一个字符。
char *p = "hello";
而下面的方法只为字符串预留内存。所以它实际上可以使用更少的内存。
char p[10] = "hello";
你不允许改变字符串常量的内容,也就是第一个p所指向的内容。第二个p是一个用字符串常量初始化的数组,您可以更改其内容。
Char *和Char[]是不同的类型,但并不是在所有情况下都能立即显示出来。这是因为数组衰减为指针,这意味着如果在需要char*类型的表达式的地方提供了char[]类型的表达式,编译器会自动将数组转换为指向其第一个元素的指针。
你的例子函数printSomething需要一个指针,所以如果你试图像这样传递一个数组给它:
char s[10] = "hello";
printSomething(s);
编译器会假装是你写的:
char s[10] = "hello";
printSomething(&s[0]);
在我的记忆中,数组实际上是一组指针。 例如
p[1]== *(&p+1)
是一个真实的陈述
APUE第5.14节:
char good_template[] = "/tmp/dirXXXXXX"; /* right way */
char *bad_template = "/tmp/dirXXXXXX"; /* wrong way*/
... 对于第一个模板,名称分配在堆栈上,因为我们使用 数组变量。然而,对于第二个名称,我们使用指针。在这种情况下,只有 指针本身的内存位于堆栈上;编译器将字符串安排为 存储在可执行文件的只读段中。当mkstemp函数尝试时 若要修改字符串,则会发生分段错误。
引用的文字与@Ciro Santilli的解释相符。