[英]Character Pointer in C
專家我對此計划有些懷疑。
#include<stdio.h>
void main() {
char str1[] = "Hello";
char * p = "Hello", * s, * q;
p = "Bye";
printf("%s", p);
s = p;
printf("%s", s);
q = str1;
printf("\n%s", q);
}
這里的p,s和q是字符指針。 眾所周知,指針存儲變量的地址,並假設如果我們使用p = str1,則它應該存儲數組str1的基地址。 那么在這里p如何像存儲字符串的數組一樣工作? 我還不太了解什么是字符指針。 真的不是指針嗎? 因為我們沒有使用&,我們也沒有獲得地址作為輸出。 請幫忙。 謝謝。
您在這里非常正確:
眾所周知,指針存儲變量的地址,並假設如果我們使用p = str1,則它應該存儲數組str1的基地址。
您的第一個問題:
那么在這里p如何像存儲字符串的數組一樣工作?
您可以說p
的行為就像一個數組,但實際上,它只是一個指針,它指向字符串str1
的基地址,該字符串是一個以空字符結尾的字符串。
您的第二個問題:
我還不太了解什么是字符指針。 真的不是指針嗎?
字符指針還是類似於C中其他類型的指針的指針。
但是這里有個陷阱。 當您這樣做時:
char a = 'A';
char *ptr = &a; // ptr points to character 'A'
這里的ptr
是指向字符的指針 。
但是當您這樣做時:
char *str = "Hello";
char *ptr = str; // ptr points to first character of string str
這里ptr
是指向字符串的指針
這里要注意的一點是-指向字符的指針與指向字符串的指針不同。
在C語言中,字符串定義為字符數組。 字符數組和字符串之間的區別是字符串以特殊字符'\\ 0'終止。 所以,
char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char str[] = "Hello";
兩者相同,但是初始化方式有所不同。
無論在程序中的何處,我們都使用str
,這將給出字符串“ Hello”的基地址。 同樣,字符串文字也是字符數組,但不能更改,因為編譯器可能會將它們放在只讀數據段中。
所以,如果我們有char *ptr = str
ptr[0] == str[0]
ptr[1] == str[1]
.....
..... and so on
因為,
ptr[0]
是*(ptr + 0)
,它是字符串str
第0個位置的字符,也可以寫為*ptr
和
ptr[1]
是*(ptr + 1)
,它是字符串str
的第一位置的字符。
當我們增加一個指針時,它會以該指針指向的對象大小的步長遞增。 在這里,ptr是指向char
指針,因此, ptr+1
將給出下一個字符的地址,而*(ptr + 1)
給出該位置的字符。 這就是為什么對於用戶而言,它看起來像一個數組。
您的第三個問題:
因為我們沒有使用&,我們也沒有獲得地址作為輸出。
如果我正確獲取它,則要打印字符串的基地址,指針指向該地址。
為了獲得字符串的基地址,指針指向您需要使用%p
。 像這樣:
#include<stdio.h>
int main() {
char str1[] = "Hello";
char * ptr = str1;
printf ("%s\n", str1);
printf ("%s\n", ptr);
printf ("%p\n", ptr);
printf ("%p\n", str1);
printf ("%p\n", &str1[0]);
return 0;
}
我的系統上的輸出:
Hello
Hello
0x7fff5e997b46
0x7fff5e997b46
0x7fff5e997b46
在這里,您可以看到ptr
, str
和&str[0]
給出了相同的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.