簡體   English   中英

C中的指針和字符串

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

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