如何在C中使用字符串和指针?

时间:2015-07-04 14:30:51

标签: c

  1. 为什么p+=*string[2]-*string[1]代替p+=string[2]-string[1](没有星号)?

  2. res[0]=*p;其值为'c'为什么?当p在单词之间移动而不是字母时,为什么*string[1]移动单词字母?

    #####我编辑了代码........." char * p = string;"可以替换为" char p = * string [0];"?
  3. 代码的输出是

      

    C

     int main (void)
     {
       char* strings[]={"abcdb","bbb","dddd"};
       char*p=*strings;
       char res[2];
       p+=*string[2]-*string[1];
       res[0]=*p;
       p+=3;
       res[1]=*p;
       printf("%s\n",res);
       return 0;   
     }
    

2 个答案:

答案 0 :(得分:2)

该程序具有未定义的行为。

我们不会考虑是否存在拼写错误而不是标识符strings,有时会使用标识符string。我们假设代码片段中的每个地方都使用了标识符strings

在本声明中

char*p=*strings;

将数组的第一个元素分配给指针。数组的第一个元素是指向字符串文字"abc"的第一个字符的指针。所以p指向字符串文字的字符'a'

在本声明中

p += *strings[2] - *strings[1];

strings[2]是类型char *的数组的第三个元素,其值是字符串文字"dddd"的第一个字符的地址。取消引用此指针*strings[2],您将获得此字符串文字的第一个字符'd'

strings[1]是类型为char *的数组的第二个元素,其值是字符串文字"bbb"的第一个字符的地址。取消引用此指针*strings[1],您将获得此字符串文字的第一个字符“b”

字符'd''b' (for example in ASCII the code of character'b'is 98 while the code of'd'的内部代码之间的差异为100)等于2。

所以这句话

p += *strings[2]-*strings[1];

将指针增加2.首先,它指向第一个字符串文字'a'的字符"abc",在增加2之后,它现在指向相同字符串文字的字符'c' "abc"

因此在本声明中

res[0] = *p;

字符'c'已分配给res[0]

在此声明之后

p+=3;

p的值变为无效,因为它现在指向超出字符串文字“abc”,并且编译器没有必要在字符串文字"bbb"之后放置字符串文字"abc"

所以在下一个语句中取消引用这个指针

res[1]=*p;

导致未定义的行为。

根据C标准

  

如果结果指向一个超过数组对象的最后一个元素的那个,那么   不得用作一元*运算符的操作数   评价

它只是发生了这样一种方式,即编译器将字符串文字一个接一个地放在内存中。虽然标准不保证这一点。

所以如果在声明之后

res[1]=*p;

res [1]不包含字符'\0',然后是下一个语句

printf("%s\n",res);

也有未定义的行为。

答案 1 :(得分:1)

首先,你的程序中没有定义string,所以你的陈述应该是p+=*strings[2]-*strings[1]

对你的两个问题的回答是取消引用指针。您需要了解指针如何处理字符串。请检查this link