Chinaunix首页 | 论坛 | 博客
  • 博客访问: 169232
  • 博文数量: 45
  • 博客积分: 1228
  • 博客等级: 中尉
  • 技术积分: 450
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-26 11:37
文章分类
文章存档

2013年(4)

2012年(3)

2011年(20)

2010年(18)

我的朋友

分类: 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 }

上述纯属个人见解,如有纰漏,还望不吝赐教。

阅读(5708) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

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