簡體   English   中英

在c的指針字符串中引用字符的索引值

[英]referencing an index value of a character in a pointer string in c

假設我有這樣的東西

int strLen;

printf("Please enter a number: ");
scanf("%d", &strLen);

char *myString;

myString = (char*) malloc(strLen*sizeof(char));

然后用“ Hello World!”之類的字符串填充字符串 但現在我只想打印“世界!” 由於我的字符串只是一個指針引用,因此無法通過索引即它來調用它。

for(int i=6;i<strLen;i++)
{
    printf("%s", myString[i]);
}
// THIS IS AN INCORRECT WAY TO DO THIS

如果我只有數組基址指針,我怎么能指代一個特定的字符,甚至將數組傳遞給程序的另一個函數? 我能否像在編譯之前將其聲明為靜態數組那樣獲得全部功能?

如果我只有數組基址指針,我怎么能指代一個特定的字符,甚至將數組傳遞給程序的另一個函數?

要記住的幾件事:

  • 除非它是sizeof或一元&運算符的操作數,或者是用於在聲明中初始化另一個數組的字符串文字,否則類型為“ T N元素數組”的表達式將替換為(“ decay to” )“ pointer to T ”類型的表達式,其值是數組第一個元素的地址;

  • 在函數參數聲明的上下文中, T a[N]T a[]是相同的T *a (IOW, a將被聲明為指針T ,不陣列T -注意,這是唯一的真正用於函數參數聲明);

  • 下標運算a[i] 定義*(a + i) -從指針表達式a指定的基地址開始,以i元素( 不是bytes )偏移,然后取消對結果的引用;

  • 在C語言中,您無需轉換malloc (或callocrealloc )的結果,因為它返回的類型為void *的值,該值可以分配給任何其他對象指針類型。 如果您忘記包含stdlib.h或在范圍內沒有原型,則添加演員表可能會抑制有用的診斷。 請注意,這不是 C ++一樣-鑄需要有的,但如果你正在寫C ++,你應該使用new的替代malloc反正。

這是長篇大論的說法,在許多情況下,數組表達式和指針表達式可以用相同的方式對待。 printf為例:

int main(void)
{
  char foo[] = "This is a test";
  char *bar = foo;

  printf("%s\n", foo);
  printf("%s\n", &foo[0]);
  printf("%s\n", bar);

  return 0;
}

printf希望與%s對應的參數的類型為char *或“ char指針”, 而不是char數組”。 上面的三個printf調用都是等效的。 在第一個調用中, foo是類型為“ 15個元素的char型數組”的數組表達式。 通過上面提到的第一條規則,它將被類型為“ pointer to char ”的表達式代替,該表達式的值是第一個元素的地址。 第二和第三次調用直接傳遞指針值,只是使用不同的表達式來實現相同的效果。

printf而言,所有三個表達式都產生相同的結果char值序列的第一個元素的地址,以0結尾。

這對您的代碼意味着什么? 好吧,一方面,您可以在mystring上使用下標運算符,就好像它是數組類型一樣:

printf("%s\n", &mystring[6]); // prints "World!"

請注意,下標運算符[]優先級高於一元&運算符,因此以上解釋為&(mystring[6]) -我們將下標轉換為mystring ,然后獲取結果的地址。

您可以將mystring傳遞給將char數組傳遞給的任何函數:

void foo(char str[]) // identical to char *str
{
  // do something with str
}
...
int main(void)
{
  char str[] = "Hello, World!";
  char *mystr = malloc(strlen(str) + 1); // note no cast
  strcpy(mystr, str);
  foo(str);
  foo(mystr);
  ...
}

同樣,就函數foo而言,其參數為char *類型,而不是char數組。 表達式str衰減為指針值,而mystr是開頭的指針值。

您可以在某個數組索引處獲取字符的地址。

因此,如果您只想打印出“世界!”,請嘗試以下操作:

#include <stdio.h>

int main(int a, char** b)
{
   int strLen;

   char *myString;

   myString = "hello world!";

   printf("%s", &myString[6]);

   return 0;
}

有兩件事:

1)在“ malloc()”中允許使用空終止符:

int strLen;
...
char *myString = (char*) malloc(strLen+1);

2)“ sizeof(char)”是一種重復冗余。 沒有傷害-但也沒有目的。 所以我省略了。

3)這是錯誤的:

for(int i=6;i<strLen;i++)
{
  printf("%s", myString[i]);
}

4)更好:

for(int i=6;i<strLen;i++)
{
  printf("%c", myString[i]);
}

暫無
暫無

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

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