C語言字元串常量
一.字元串常量的聲明
char *p = "hello";//指針直接往上戳
一個字元串常量為什麼會給一個指針指派? 字元串常量是一個表達式,既然使表達式就會有值,字元串常量的值是該字元串第一個字母的首位址
同一個字元串常量,它們的值(位址)相同
#include <stdio.h>
int main(void){
char *p =
"hello";
char *q =
"hello";
printf(
"%p\n%p", p, q);
return
0;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CO3cDM3IzNwkTNwkTNkJmMzYzX0ATNyETMyIzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
注意,上面的例子中使用了不同的指針指向同樣内容的字元串常量,輸出的結果卻一樣,這就說明多次使用同樣内容的字元串常量,在記憶體中,都隻儲存一次該字元串常量。
結論:字元串本身是有值的,就是第一個字元的位址。
因為它的值是位址,是以可以這樣用
#include <stdio.h>
int main(void){
printf(
"%p\n",
"hello");
printf(
"%p\n",
"hello" +
1);
printf(
"%c\n", *(
"hello" +
1));
printf(
"%c\n",
"hello"[
1]);
return
0;
二.注意事項
1.字元串常量和字元數組不同,無法通過下标(指針間接引用)來直接修改。
2.如果要修改字元串的值,我們隻能使用字元數組的形式來存儲字元串,可以這樣聲明:char str[] = "hello";,這樣就可以修改了,它兩本質上的不同是存儲的位置不同。
C語言字元串常量
一.字元串常量的聲明
char *p = "hello";//指針直接往上戳
一個字元串常量為什麼會給一個指針指派? 字元串常量是一個表達式,既然使表達式就會有值,字元串常量的值是該字元串第一個字母的首位址
同一個字元串常量,它們的值(位址)相同
#include <stdio.h>
int main(void){
printf(
"%p\n",
"hello");
printf(
"%p\n",
"hello" +
1);
printf(
"%c\n", *(
"hello" +
1));
printf(
"%c\n",
"hello"[
1]);
return
0;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CO3cDM3IzNwkTNwkTNkJmMzYzX0ATNyETMyIzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
注意,上面的例子中使用了不同的指針指向同樣内容的字元串常量,輸出的結果卻一樣,這就說明多次使用同樣内容的字元串常量,在記憶體中,都隻儲存一次該字元串常量。
結論:字元串本身是有值的,就是第一個字元的位址。
因為它的值是位址,是以可以這樣用
#include <stdio.h>
int main(void){
printf(
"%p\n",
"hello");
printf(
"%p\n",
"hello" +
1);
printf(
"%c\n", *(
"hello" +
1));
printf(
"%c\n",
"hello"[
1]);
return
0;