我是C / C ++的新手。
char *x="hello world";
char x[]="hello world";
我知道第一个是指针,第二个是字符数组。但是,我不明白char * x是如何工作的。
int a=1;
int *b=&a;
&a是内存地址。b是指针。但是,“ hello world”的内存地址是什么。它如何应用于x指针?有人可以解释一下吗?
答案 0 :(得分:0)
在C语言中,所有文字字符串都存储为不可修改(但为 not 常量)字符数组,包括空终止符。
操作时:
char *x = "hello world";
您初始化x
指向此类数组的第一个元素(请记住数组会衰减到指向其第一个元素的指针)。
类似于:
char s[] = "hello world";
char *x = s;
但是区别在于此示例中的字符串是可修改的。
答案 1 :(得分:0)
"hello world"
的内存地址是什么?
在执行之前没有人可以说。字符串文字"hello world"
的确切地址由操作系统在执行时确定,并且进一步取决于您的实现和资源。程序对字符串文字在内存中的确切位置没有影响。
“它如何适用于指针
x
?有人可以解释一下吗?”
char *x = "hello world";
x
是指向char
的指针(您已经知道); "hello world"
是存储在只读存储器中的字符串文字,不可修改。
使用此语句,指针x
由该字符串文字的第一个元素(实际上为h
)的地址初始化,该地址位于只读存储器内部。
由于字符串文字会自动求出指向其第一个元素的指针,因此无需使用&
运算符。
看看:
What is the difference between char s[] and char *s?
https://en.cppreference.com/w/cpp/language/string_literal
https://en.wikipedia.org/wiki/String_literal
旁注:
x
仅指向字符串文字,则使其指向const char
(const char *x
)的指针。这样,程序将不会通过任何无意的写尝试来修改字符串文字而不会调用任何未定义的行为。答案 2 :(得分:0)
让我们举个例子;
char * b =“ john”; 这里b是一个指针变量。(b)的大小为4个字节,您必须了解ting p和&p不相同,在上面的示例中b存储在堆栈中,而“ john”存储在内存,char * b =“ john”; b = petter; b ++是有效的.char * b =“ john”; b [0] = n。
语句'char * b =“ john”创建字符串文字。大多数编译器将字符串文字存储在内存的只读部分中。 C和C ++标准说,字符串文字具有静态的存储期限,任何对其进行修改的尝试都将导致未定义的行为。
答案 3 :(得分:0)
简短的回答:它们基本相同。
我认为您在这里所缺少的是,如果您创建一个Array,则基本上会创建一个指向Memory中第一个元素的指针。 (此页面很好地总结了:https://www.studytonight.com/c/pointers-with-array.php#:~:text=Pointer%20and%20Arrays%20in%20C,also%20allocated%20by%20the%20compiler.&text=We%20can%20also%20declare%20a,point%20to%20the%20array%20arr%20。)
char *x="hello world";
确实是创建字符串“ hello world”,并将第一个字符的位置存储在指针变量x中。 那和
一样 char x[]="hello world";
因此,以下代码为x和y产生相同的输出:
char *x= "hello world";
char y[] = "hello world";
printf("x[0]: %c \n", x[0]);
printf("y[0]: %c \n", y[0]);
printf("x: %s \n", x);
printf("y: %s \n", y);