[英]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
(或calloc
或realloc
)的結果,因為它返回的類型為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.