分类: C/C++
2010-09-26 17:06:10
使用指针的指针
最近学习指针,被那个二重指针搞的挺晕的,今天特地来总结以下。使用指针的指针一般分为三种情况。
Case1:需要在子函数中改变指针的指向,既需要用指针带回一个地址时,例如
1
#include
2//查询出src字符所在的位置并在rt中返回。
3 int find(char *s, char src, char **rt)
4 {
5 int i = 0;
6 while(*(s + i))
7 {
8 if(*(s + i) == src)
9 {
10 *rt = s + i;
11 }
12 i++;
13 }
14 return 0;
15 }
16
17 int main(void)
18 {
19 char a[10]= "zhuyujia";
20 char *p;
21 find(a, 'y', &p);
22 printf("%s", p);
23 return 0;
24 }
case 2:用指针的指针取二维数组的元素。
一维数组数组名想到与一个指针,而二维数组的数组名却不想当于指针的指针。所以不能这样:(这个例子是错的,以为证明不可以这样做)
1
#include
2
3 int change(char **p)
4 {
5 int i, j;
6 for(i = 0; i < 5; i++)
7 {
8 for(j = 0; *(*(p + i) + j) != '\0'; j++)
9 {
10 printf("%c",*(*(p + i) + j)) ;
11 }
12 printf("\n");
13 }
14 return 0;
15 }
16
17 int main(void)
18 {
19 char a[5][10] = {"hello", "zhuyu", "jiajia", "linux","Ubuntu"};
20 change(a);
21 return 0;
22 }
若希望赋值,则不能使用指针的指针,要使用数组进行运算。
1
#include
2
3 int change(char p[][10])
4 {
5 int i, j;
6 for(i = 0; i < 5; i++)
7 {
8 for(j = 0; p[i][j] != '\0'; j++)
9 {
10 p[i][j] = 'c';
11 printf("%c",p[i][j]);
12 }
13 printf("\n");
14 }
15 return 0;
16 }
17
18 int main(void)
19 {
20 char a[5][10] = {"hello", "zhuyu", "jiajia", "linux","Ubuntu"};
21 change(a);
22 return 0;
23 }
如果必须要用指针的指针需要这样做:
1
#include
2
3 int change(char **p)
4 {
5 int i, j;
6 for(i = 0; i < 5; i++)
7 {
8 for(j = 0; *(*(p + i) + j) != '\0'; j++)
9 {
10 *(*(p + i) + j) = 'c';
11 printf("%c",*(*(p + i) + j)) ;
12 }
13 printf("\n");
14 }
15 return 0;
16 }
17
18 int main(void)
19 {
20 char a[5][10] = {"hello", "zhuyu", "jiajia", "linux","Ubuntu"};
21 char *b[5]={a[0],a[1],a[2],a[3],a[4]};//这样做读取和写入操作都是可以的。
22 change(b);
23 return 0;
24 }
case 3:用指针的指针指向指针数组。
1
#include
2
3 int change(char **p)
4 {
5 int i, j;
6 for(i = 0; i < 5; i++)
7 {
8 for(j = 0; *(*(p + i) + j) != '\0'; j++)
9 {
10 printf("%c",*(*(p + i) + j)) ;
11 }
12 printf("\n");
13 }
14 return 0;
15 }
16
17 int main(void)
18 {
19 char *a[5] = {"hello", "zhuyu", "jiajia", "linux","Ubuntu"};//如果想使用 需使用指针数组即*a[5] 声明一个有五个字符串指针的数组。但是由于每个元素都是指针字符串,所以只能够读取,而不能够写入。
20 change(a);
21 return 0;
22 }
上述纯属个人见解,如有纰漏,还望不吝赐教。
dalangbiji2020-04-26 17:30:37
大神 case1中我修改了下代码
int find2(char *s, char src, char *rt){
printf(\"rt addr = 0x%p\\n\", rt);
int i = 0;
char* t;
while(*(s + i)){
if(*(s + i) == src){
rt = s + i; //这样不对 这样改变了指针rt的地址
t = s + i;
}
i++;
}
printf(\"rt addr&nb
dalangbiji2020-04-26 17:30:30
大神 case1中我修改了下代码
int find2(char *s, char src, char *rt){
printf(\"rt addr = 0x%p\\n\", rt);
int i = 0;
char* t;
while(*(s + i)){
if(*(s + i) == src){
rt = s + i; //这样不对 这样改变了指针rt的地址
t = s + i;
}
i++;
}
printf(\"rt addr&nb
chinaunix网友2010-09-29 14:35:41
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com