C语言,关于字符串指针作参数方面的问题。

#include <stdio.h>

void main(){
char swap(char *a,char *b);
char str[3][20];
int i;
char (*p)[20];
printf("输入三个字符串 \n");
for(i=0;i<3;i++){
gets(str[i]);
}
p = str;
if(strcmp(str[0],str[1])) swap(p,p+1);
if(strcmp(str[0],str[2])) swap(p,p+2);
if(strcmp(str[1],str[2])) swap(p+1,p+2);
for(i=0;i<3;i++){
printf("%s\n",str[i]);
}
}

char swap(char *a,char *b){
char *temp;
temp = *a;
*a = *b;
*b = temp;
}

我想把p作参数传进swap函数里,我知道要改变指针的值才可以。
但是我这里应该怎么弄,我在函数外部调试的时候,*p就刚好是字符串的起始地址,但是我把p传进函数,*a就变成了字符串第一个字母。
该怎么弄才能达到我想要的效果?
我如果把函数写成

char swap(char (*a)[20],char (*b)[20]){
char *temp;
temp = *a;
*a = *b;
*b = temp;
}

就不能通过编译了
提示说
error C2106: '=' : left operand must be l-value;

如果不加*a的话,能通过编译,但是又不是值修改,达不到效果,该怎么办?

你要实现这种效果的话,建议你使用**a和**b作参数(形参)
即void swap(char **a,char **b)
因为char*是字符数组,后面跟的相当于字符数组名,
而指向字符数组(字符串)的指针,那就再加一星号,char**就是指向字符数组的指针了(当然它也可以表示字符串数组)

函数定义时使用char **a和char **b作参数,函数内容不需要变。
使用这两个形参后,在函数体中,*a表示指针a指向的字符数组(字符串),*b表示指针b指向的字符数组(字符串),因此,函数体不需要做改变,像原来那样写就行
温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-04-15

C语言字符串的学习,输入指定字符串,并且计算字符串的位数

相似回答