C中的指针和字符串

时间:2012-03-26 20:32:38

标签: c string pointers

我正在尝试编写一个函数来修改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的第一个地址,但修改了内容,或者是否会返回地址与原始内容?

4 个答案:

答案 0 :(得分:4)

char *func(char *s)

在此代码中,s是指向内存区域的指针,(我假设)表示字符串。

s++;

现在s指向同一内存区域中的下一个字符,(我假设)代表一个字符串。

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
 }

答案 1 :(得分:2)

  

如果我做t ++;和* t ='a';然后返回s,它会返回地址吗?   s的第一个地方,但内容已经修改或将返回   地址与原始内容?

我相信你的问题假设是这样的:

char s[] = "abcde";
char *t = s;
t++;
*t = 'a';

这里你有一个字符串和两个指针,最初都指向字符串的开头。在第三行,您修改其中一个指针以指向下一个字符。在第四行,您修改该位置的数据。由于s指向相同的数据,并且数据被修改,因此指向的字符串将发生变化。

printf("s is: %s\n", s");   // s is: aacde
printf("t is: %s\n", t");   // t is: acde
顺便说一下,真正学习这些东西没有比写小测试程序和玩它们更好的方法了。一本好书将解释事情应该如何运作,但是使用代码是你成长为真正理解代码并相信书籍告诉你的方式。

答案 2 :(得分:0)

在代码中:

char *func(char *s)
{
    char *t=s;
}

你缺少一个return语句,所以返回垃圾。

变量s是传递给函数的任何内容的本地副本。如果在函数内部写s++,则更改本地指针指向的内容,但不要更改参数。

当您执行t++;*t = 'a';时,您将t指向作为s传递的字符串的第二个字符,然后指定字符{{1那个。

所以,如果你有:

'a'

然后返回值将是指向原始字符串的第二个字符的指针,该字符串已被修改为包含char *func(char *s) { char *t = s; s++; t++; *t = 'a'; return s; }

答案 3 :(得分:0)

您需要什么行为?

返回s的初始值,并返回s的最终值是有意义的。

您没有的一个选项是*t='a',但返回原始内存不变。内存已更改

返回原始s很常见,例如strcpy。

在我刚刚修改过的字符之后返回指向下一个字符的指针也很常见。 (这是你没有提供的选项)。

您需要仔细思考,并确定该功能有用的功能是什么?