原代码如下,如果要通过二级指针p输出a[]中每个字符串的第二个字母,该如何修改代码?
#include<stdio.h>
int main()
{
char *a[]={"abcd","ef","gh","ijk"};
char **p=&a[1];
int i;
for(i=0;i<4;i++)
printf("%c",**p++);
return 0;
}
如果要通过二级指针p输出a[]中每个字符串的第二个字母,1、修改指针p指向a的第一个元素 2、 输出每个字符串的第二个字母,修改后代码:
#include <stdio.h>
int main()
{
char *a[]={"abcd","ef","gh","ijk"};
char **p=&a[0]; // 修改指针p指向a的第一个元素
int i;
for(i=0; i<4; i++)
printf("%c",*(*(p+i)+1)); // 输出每个字符串的第二个字母
return 0;
}
int main()
{
char* a[] = { "abcd","ef","gh","ijk" };
char** p = &a[0];
int i;
for (i = 0; i < 4; i++)
{
printf("%c", *(*p+1));
p++;
}
return 0;
}
供参考:
#include<stdio.h>
int main()
{
char* a[] = { "abcd","ef","gh","ijk" };
char** p = a; //&a[1]; // 修改
int i;
for (i = 0; i < 4;p++, i++) // 修改
printf("%c", *(*(p)+1)); // 修改
return 0;
}
实际上所谓的值传递和地址传递都是值传递,实参传递给行参的时候都是进行一份数据的拷贝;
如果同级指针之间进行传递,比如实参和形参都是零级指针,这时候就是最容易让人理解的值传递,大家都知道这样在被调函数里对形参的修改不会影响实参;同理如果实参和形参都是一级指针,在被调函数里又没有通过*进行间接修改的话,被调函数的修改也不会影响主调函数的实参;
对于被调函数能否修改主调函数实参的内容,关键是看在被调函数里是否存在使用*进行间接访问,或者存在数组的下标访问,这两种访问都是一种间接访问的方式。
如果想修改一级指针的值,那么形参要用二级指针;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getMem3(char **myp1, int *mylen1, char **myp2, int *mylen2)
{
int ret = 0;
char *tmp1, *tmp2;
tmp1 = (char *)malloc(100);
strcpy(tmp1, "1132233");
//间接赋值
*mylen1 = strlen(tmp1); //1级指针
*myp1 = tmp1; //2级指针的间接赋值
tmp2 = (char *)malloc(200);
strcpy(tmp2, "aaaaavbdddddddd");
*mylen2 = strlen(tmp2); //1级指针
*myp2 = tmp2; //2级指针的间接赋值
return ret;
}
int main()
{
int ret = 0;
char *p1 = NULL;
int len1 = 0;
char *p2 = NULL;
int len2 = 0;
ret = getMem3(&p1, &len1, &p2, &len2);
if (ret != 0)
{
printf("func getMem3() err:%d \n", ret);
return ret;
}
printf("p1:%s \n", p1);
printf("p2:%s \n", p2);
if (p1 != NULL)
{
free(p1);
p1 = NULL;
}
if (p2 != NULL)
{
free(p2);
p2 = NULL;
}
printf("p1:%d \n", p1);
system("pause");
return ret;
}