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

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

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

#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') {    //斷點1
            if (*(*strings)++ == value) {
                return TRUE;
            }
        }
        strings++;    //在未執(zhí)行這一句指針自增運算的時候(比如在檢測"there is a dog."是否包含目標字符的過程中),斷點1處的strings值是一直不變的。也就是說:這句指針自增導(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(并沒有改變傳入的參數(shù)。
并且我GDB調(diào)試find_str()的過程中,設(shè)置了斷點1,在檢測"there is a dog."這個字符串中是否包含目標字符'm'的過程中,strings值(是一個地址)是一直不變的。那在find_str()里,哪一句導(dǎo)致了傳入的指針strings被修改?

回答
編輯回答
萌二代

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

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 }

這里只有兩處會修改變量值

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

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

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

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


舉一反三,計算下面代碼運行完之后,各個變量的值

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

(*strings)++;

答案是只有 strings 的第一個元素被改了,原來是 s0,變成 s0 + 1

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

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

2018年3月31日 01:16