利用二级指针处理字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用二级指针处理字符串相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#define NULL 0
main()

char **pp;
static char *greeting[]="Hello","Goodbye","How are you"," ";
pp=greeting;
while(**pp!=NULL)
printf ("%s\n",*pp++);


运行的时候有些问题,请问这个程序哪里有错误或者不太合适的地方

while(*pp!=NULL)这个判断条件不对。
因为当greeting中的字符串都输出结束后,pp指向的地方,是greeting数组的末尾的下一个字节,而不是字符串的结束符。而这个字节的值是未知的,而且很大可能是非零的,这就导致了循环还会继续。
正确的方法是
for(int i=0;i<sizeof(greeting)/sizeof(char *);i++)
printf("%s\n",*pp++);
参考技术A 其实不用那么复杂,把" "改成""就好了。" "中间是空格,与你的判定结束条件不符,""才是0。不知道你理解与否。另外更简洁的判定条件是while(**pp),你试一下。

C 真正理解二级指针

  本文转载自CSDN博主liaoxinmeng,做数据结构时遇到指针方面的问题,想了许久,因此我觉得很有必要复习一下二级指针及其使用

 


 

正文如下:  

  指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也经常用到:比如说对于字符串的处理,函数参数的“值,结果传递”等,对于二级指针或者多级指针,我想理解起来也是比较容易的,比如二级指针就是指向指针的指针.....n级指针就是....

 

                                      p    *p   **p
                                      ---  ---  ----
                                      | |->| |->|  |
                                      ---  ---  |  |
                                                |  |
                                                ----

  但是可能大家比较不容易理解的是,二级指针或者多级指针用在哪里呢?怎么使用呢?有没有必要用呢?

  现在我就谈谈C指针的比较经常用到的地方:

  我们都知道C语言中函数传递参数都是传递"值"的,如下:

void fun(void)
{
     int tmp = 0;
     change(tmp);
     printf("################ tmp = %d /n");
     return ;
}

void change(int tmp_t)
{
   tmp_t =1;
   return;
} 

  这个时候fun()中打印出来的tmp值还是0,因为我们传递的是“值”,如果你想在函数change()中修改这个tmp的值能在fun()中生效的话,那么就需要用指针来传递了如下:

void fun(void)
{
     int tmp = 0;

     change(&tmp);

     printf("################ tmp = %d /n");

     return ;
}

 

void change(int *tmp_t)
{
   *tmp_t =1;

   return;
}

  这个时候fun()中打印出来的tmp值就是1了,因为我们此时传进来的是tmp的地址,所以我们在change()中tmp_t就是tmp的地址了,而对于*tmp_t的操作其实就是对tmp的操作了。

  到这里的时候我们可以试想一下,我们通过传递指针来达到修改一个值的目的,那么当你需要修改一个指针的时候呢,这个时候我们就需要指针的指针了,如下:

int fun(void)
{
     int *buf ;

     int ret ;

     ret = mem_init(&buf);

     return ret;
}

int mem_init(int **buf_t)
{
  *buf_t = malloc(100);

  return 1;
}  

  通过上面我们可以发现,fun()函数通过调用men_init()函数来实现给buf分配内存空间的目的。首先buf是我们定义的一个指针,&buf则是指向buf的指针(二级指针),我们通过把&buf传递个men_init()函数,那么此时二级指针buf_t=&buf了,所以说buf_t是指向buf的指针,那么对于*buf_t的操作其实就是对buf的操作了,这样fun()就可以通过men_init()来分配内存了。

  补充一点:对于定义的int **buf_t中,二级指针buf_t=&buf,指向为buf(还是一个指针),一级指针*buf_t=buf,指向为*buf,值**buf_t= *buf

  对于n级指针的使用也是差不多这样了

  这是本人的一点理解,如果有不对,希望大家多多指导。

 


 

运用:

  声明一个结构体类型

typedef struct node
{

}TreeNode,*Tree;

 

  在main函数中我们定义一个Tree型的变量t,记Tree=t;

  现在声明一个Create函数,目的是创建一棵树,显然,这需要传入地址进行操作,那么参数应该设定为什么呢?

  由这篇文章我们知道,当我们通过传递指针来修改值,当我们需要修改的是指针时,那么就需要通过传递指针的指针进行修改了,

正确代码如下:     

Void Create(Tree *t);

int main()
{
    Tree t;
    Create(&t);
    return 0;        
}

 

以上是关于利用二级指针处理字符串的主要内容,如果未能解决你的问题,请参考以下文章

利用二级指针进行链表操作

C 语言二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 )

C 语言二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )

C语言二级指针应用详解

C 语言二级指针作为输入 ( 指针数组 | 将 二级指针 作为函数输入 | 抽象函数业务逻辑 )

delphi中的二级指针怎么定义