[英]Pointers and Strings in C
我正在嘗試編寫一個函數來修改C中的字符串。
char *func(char *s){
char *t=s;
s++; //option 1
t++; //option 2
*t='a'; //option 2
return s;
}
如果我做類似[option 1]的事情: s++;
我相信它將使指針返回到s所指向的位置。 如果我做[選項2]: t++;
和*t='a';
然后return s
,將它的第一個點返回地址s
但修改的內容還是會與原來的內容返回地址?
char *func(char *s)
在此代碼中, s
是指向內存區域的指針,(我假設)表示字符串。
s++;
現在s
指向內存相同區域中的下一個char(我假設)表示一個字符串。
char *t=s;
現在,您有兩個指向該內存區域的指針。
t++;
*t='a';
現在,您已經更改了內存區域,將第二個字符替換為'a'
。
因此:如果然后返回s
,則將返回一個指向已更改的相同內存區域的指針。 如果要返回更改后的字符串副本,則必須先創建內存副本。
char *func(char *s){
char *t=strdup(s); //duplicates a string
s++;
*t='a';
free(t); //you have to free the memory from strdup at some point
return s; //returns pointer to second character of unchanged string
}
如果我做++; 和* t ='a'; 然后返回s,它將返回s的第一個位置但內容已修改的地址,還是返回具有原始內容的地址?
我相信您的問題假設是這樣的:
char s[] = "abcde";
char *t = s;
t++;
*t = 'a';
在這里,您有一個字符串和兩個指針,它們最初都指向字符串的開頭。 在第三行,您修改指針之一以指向下一個字符。 在第四行,您在該位置修改數據。 由於s
指向相同的數據,並且數據已修改,因此s指向的字符串將更改。
printf("s is: %s\n", s"); // s is: aacde
printf("t is: %s\n", t"); // t is: acde
順便說一句,沒有什么比編寫一些小的測試程序並玩它們更好的了。 一本好書將解釋事物應該如何工作,但是玩代碼是您真正理解代碼並相信書中告訴您的方式。
在代碼中:
char *func(char *s)
{
char *t=s;
}
您缺少return語句,因此將返回垃圾。
變量s
是傳遞給函數s
內容的本地副本。 如果在函數內部編寫s++
,則可以更改本地指針指向的內容,但不要更改參數。
當你做t++;
和*t = 'a';
,您將t
指向作為s
傳遞的字符串的第二個字符,然后為其分配字符'a'
。
因此,如果您有:
char *func(char *s)
{
char *t = s;
s++;
t++;
*t = 'a';
return s;
}
那么返回值將是指向原始字符串第二個字符的指針,該字符串已被修改為包含'a'
。
您需要什么行為?
返回s的初始值和返回s的最終值都是有意義的。
您沒有的一個選項是*t='a'
但返回時的原始內存不變。 內存已更改
返回原始s很常見,例如strcpy。
通常返回一個指針到“我剛剛修改的字符后的下一個字符”(這是您未提供的選項)的指針。
您需要仔細考慮,並決定該功能對您有什么幫助?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.