没错,又是我,就在刚刚我又有了新的收获,我又来带货,直接冲冲冲!!!
指针
要求用函数改变实参的值
1.char *ps1= “Hello”; char ps2 = “World”;
2. char str[2][10] = {“Hello”,“world”}; //交换str[0]和str[1]
3. char str[2] = {“Hello”,“world”}; //交换str[0]和str[1
由于题目繁多,我直接上解析了。
1.首先我们知道这是一个一级指针,该指针指向字面值字符串(存储在常量区),无法通过类似数组下标的方式对其值进行修改,那我们只能修改其地址,从而达到修改实参值的目的,而要修改一级指针的地址,我们就需要引用二级指针来改变地址。
1 #include<stdio.h>
2 void swap(char **pps1,char **pps2){
3 char *mid=*pps1;
4 *pps1=*pps2;
5 *pps2=mid;
6
7 }
8
9 int main(){
10 char *p1="hello";
11 char *p2="world";
12 swap(&p1,&p2);
13 printf("%s %s\n",p1,p2);
14
15 return 0;
16 }
2.这是一个二维数组,可以看成两个一维数组拼接而成,而这个一维数组里面存储是一个字符串(存储在栈区),我们不仅可以通过修改地址,还可以直接修改值来实现。
1)修改地址
1 #include<stdio.h>
2 void swap(char **pps1,char **pps2){
3 char *mid=*pps1;
4 *pps1=*pps2;
5 *pps2=mid;
6
7 }
8
9 int main(){
10 char str[2][10]={"hello","world"};
11 swap((char **)str[0],(char**)str[1]);//需要 char* => char **
12 printf("%s %s\n",str[0],str[1]);
13
14 return 0;
15 }
2),修改值(方法不唯一)
1 #include<stdio.h>
2 void swap(char *str1,char *str2){
3 while(*str1!='\0'){ //这里要考虑长度等问题,但题目两个strlen一样
4 char mid=*str1;
5 *str1=*str2;
6 *str2=mid;
7 str1++;
8 str2++;
9 }
10
11 }
12
13 int main(){
14 char str[2][10]={"hello","world"};
15 swap(str[0],str[1]);
16 // printf("%p\n",str[0]);
17 printf("%s %s\n",str[0],str[1]);
18
19 return 0;
20 }
3.其实这题跟1 .题类似,只不过用数组来存放指针。
1 #include<stdio.h>
2 void swap(char **str1,char **str2){
3 char *mid=*str1;
4 *str1=*str2;
5 *str2=mid;
6 }
7 int main(){
8 char *str[2]={"hello","world"};
9 swap(&str[0],&str[1]);//这里需要引起注意,str[]=*str与传输参数不符需要取地址
10
11 printf("%s %s\n",str[0],str[1]);
12
13 return 0;
14 }