簡體   English   中英

C中的字符指針

[英]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

在這里,您可以看到ptrstr&str[0]給出了相同的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM