在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/C/ 《C和指針》6.12章節(jié)遇到的關(guān)于指針的問(wèn)題

《C和指針》6.12章節(jié)遇到的關(guān)于指針的問(wèn)題

該章節(jié)針對(duì)針對(duì)指針舉了一個(gè)例子:在一個(gè)數(shù)據(jù)結(jié)構(gòu)體里找某個(gè)字符是否存在。
下面是我按例程寫(xiě)的:

#include <stdio.h>

#define TRUE 1
#define FALSE 0

int find_str(char **, char);
int find_str_1(char **, char);

int main()
{
    char *strings[] = {
        "there is a dog.",
        "no,that's a cat.",
        NULL
    };
    int ret;

    ret = find_str(strings, 'm');   //改變了strings
    //ret = find_str_1(strings, 'm'); //不改變strings
    printf("%d\n", ret);
    
    return 0;
}

int find_str(char **strings, char value)
{
    while (*strings != NULL) {
        while (**strings != '\0') {    //斷點(diǎn)1
            if (*(*strings)++ == value) {
                return TRUE;
            }
        }
        strings++;    //在未執(zhí)行這一句指針自增運(yùn)算的時(shí)候(比如在檢測(cè)"there is a dog."是否包含目標(biāo)字符的過(guò)程中),斷點(diǎn)1處的strings值是一直不變的。也就是說(shuō):這句指針自增導(dǎo)致了傳入的strings參數(shù)被改變?那為什么find_str_1()里面的那句指針自增未改變傳入的參數(shù)?
    }
    return FALSE;
}

int find_str_1(char **strings, char value)
{
    char *line;

    while ((line = *strings) != NULL) {
        while(*line != '\0'){
            if (*line++ == value) {
                return TRUE;
            }
        }
        strings++;
    }

    return FALSE;
}

讓我很搞不懂的是:
find_str()改變了傳入的參數(shù),而find_str_1(并沒(méi)有改變傳入的參數(shù)。
并且我GDB調(diào)試find_str()的過(guò)程中,設(shè)置了斷點(diǎn)1,在檢測(cè)"there is a dog."這個(gè)字符串中是否包含目標(biāo)字符'm'的過(guò)程中,strings值(是一個(gè)地址)是一直不變的。那在find_str()里,哪一句導(dǎo)致了傳入的指針strings被修改?

回答
編輯回答
萌二代

find_str() 里的 if (*(*strings)++ == value) 展開(kāi)成兩段,如下

1  int find_str(char **strings, char value)
2  {
3      while (*strings != NULL) {
4          while (**strings != '\0') {
5              int match = **strings == value;
6              (*strings)++;
7              if (match) {
8                  return TRUE;
9              }
10         }
11         strings++;
12     }
13     return FALSE;
14 }

這里只有兩處會(huì)修改變量值

  1. 行 11 修改了局部變量 strings ,這個(gè)不會(huì)影響原來(lái)的參數(shù)內(nèi)容。
  2. 行 6 修改了參數(shù) strings 的元素值,這個(gè)影響原來(lái)的參數(shù)內(nèi)容。

你可以這樣理解第二處的修改

strings[i] = strings[i] + 1;

strings[i] 是一個(gè)字符串指針,因此每執(zhí)行一次將導(dǎo)致該字符串指針往后移,
直到找到目標(biāo)字符,或字符串結(jié)尾。


舉一反三,計(jì)算下面代碼運(yùn)行完之后,各個(gè)變量的值

char *s0 = "123";
char *s1 = "abc";
char *s2 = NULL;
char *strings[] = {s0, s1, s2};

(*strings)++;

答案是只有 strings 的第一個(gè)元素被改了,原來(lái)是 s0,變成 s0 + 1。

2017年1月29日 06:35
編輯回答
青黛色

應(yīng)該是if那里的自增

2018年3月31日 01:16