《C和指针》6.12章节遇到的关于指针的问题

该章节针对针对指针举了一个例子:在一个数据结构体里找某个字符是否存在。
下面是我按例程写的:

#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++;    //在未执行这一句指针自增运算的时候(比如在检测"there is a dog."是否包含目标字符的过程中),断点1处的strings值是一直不变的。也就是说:这句指针自增导致了传入的strings参数被改变?那为什么find_str_1()里面的那句指针自增未改变传入的参数?
    }
    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()改变了传入的参数,而find_str_1(并没有改变传入的参数。
并且我GDB调试find_str()的过程中,设置了断点1,在检测"there is a dog."这个字符串中是否包含目标字符'm'的过程中,strings值(是一个地址)是一直不变的。那在find_str()里,哪一句导致了传入的指针strings被修改?

阅读 2.2k
2 个回答

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 ,这个不会影响原来的参数内容。
  2. 行 6 修改了参数 strings 的元素值,这个影响原来的参数内容。

你可以这样理解第二处的修改

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

strings[i] 是一个字符串指针,因此每执行一次将导致该字符串指针往后移,
直到找到目标字符,或字符串结尾。


举一反三,计算下面代码运行完之后,各个变量的值

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

(*strings)++;

答案是只有 strings 的第一个元素被改了,原来是 s0,变成 s0 + 1

应该是if那里的自增

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进