二级指针的使用例子,举例说明二级指针如何操作数组

1,举例说明二级指针如何操作数组int **pp;int a[3][3]=pp = a;//二重指针可以用来操作二维数组//下面你就可以直接写pp[i][j]来访问a[i][j]了//也可以写为*(*(pp+i)+j) //注意不要越界就可以了,二维数组的数组名字可以看做是二重指针,但是静态的二重指针,不能被赋值~【二级指针的使用例子,举例说明二级指针如何操作数组】
2,利用二级指针处理字符串while(*pp!=NULL)这个判断条件不对 。因为当greeting中的字符串都输出结束后,pp指向的地方 , 是greeting数组的末尾的下一个字节,而不是字符串的结束符 。而这个字节的值是未知的,而且很大可能是非零的 , 这就导致了循环还会继续 。正确的方法是 for(int i=0;i<sizeof(greeting)/sizeof(char *);i++) printf("%s\n",*pp++);
3,C语言如何用二级指针给N个整数排序通过二级指针去访问二维数组需要先给二级指针分配等同于二维数组行数的一维数组指针,然后把二维数组的每行首地址赋值给对应位置的一维指针上 。之后就可以通过二维指针直接访问了 。参考代码如下,可以看具体注释辅助理解 。12345678910111213141516171819202122232425#include <stdio.h>//输入输出头文件 。#include <stdlib.h>//本程序需要用到malloc/free函数,引用该头文件 。int main()用二维指针访问二维数组多用于函数调用 。对于一维数组,如果函数参数为一维指针可以直接用数组名当做函数参数 。但是如果函数参数为二维指针,直接用二维数组名做参数会出现访问出错 , 是因为二维指针和二维数组的访问方式不同造成的,需要如示例代码中做转换 。另外一种常用的方法是利用二维数组的内存连续性将二维数组转为一维数组处理 , 与本题无关,不做更多描述 。
4 , 关于C语言中的二级指针2级指针就是指向指针的指针你把第1层指针理解成一个变量就好理解了!int a = 0;int *b = &a;int **c = &b;二级指针就是指针的指针,如上c是一个二级指针,他保存的是指针b的地址,b是一个一级指针,保存变量a的地址 , 对二级指针c取内容*c,得到的将是变量a的地址&a #includemain(){inta,b;/*定义a,b两个整形变量用于输入两个整数*/ int*point_1,*point_2,*temp_point;/*定义三个指针变量*/ scanf("%d,%d",&a,&b);/*格式化输入a,b的值*/ point_1=&a;/*把指针变量point_1的值指向变量a的地址*/ point_2=&b;/*把指针变量point_2的值指向变量b的地址*/ if(amain(){inta,b;/*定义a,b两个整形变量用于输入两个整数*/ int*point_1,*point_2;/*定义三个指针变量*/ scanf("%d,%d",&a,&b);/*格式化输入a,b的值*/ point_1=&a;/*把指针变量point_1的值指向变量a的地址*/ point_2=&b;/*把指针变量point_2的值指向变量b的地址*/ compositor(point_1,point_2);/*调用自定义的排序涵数,把a,b的地址传递给point_1和point_2*/ printf("%d,%d",a,b);/*打印出a,b的值*/ }staticcompositor(p1,p2)int*p1,*p2;/*定义形式参数p1,p2为指针变量*/ {inttemp;/*建立临时存储变量*/if(*p1<*p2)/*如果*p1其实二级指针说白了就是一种类型而已,类似于int,float为什么有二级指针呢,就是为了类型匹配比如:int i = 0;float j = 1.0f;i = j 这样赋值就是类型不匹配int i = 1;int *j = &i;int **k = &j;int *j = &i就是把i的地址值赋给j , 等价于int *j;j = &i;*j是通过j中保存的地址取到那个地址放的一个值,所以j需要一个地址类型跟它匹配,所以是&i同样道理 , **j就是要求赋值给它的是一个地址,而且这个地址存放的是另一个地址,k刚好满足这个条件,它本身也有地址&k,而且它存放的是i的地址&i,所以它的类型跟**j类型匹配,可以赋值 。这样,*j == &i,**j == i指针,就是一个地址,变量的地址、函数的地址、数组的首地址;Type aType[m][n][o]...[x][y][z] 等价于 Type (*const pType)[n][o]...[x][y][z]只是表达上的区别;指针指的是数据的首地址,通过*(pType+i)来引用数据,而数组是用下标aType[i];没区别,只不过指针对应的是内存中的实体地址(Windows下线性地址),而且多级指针理解会复杂一些,***太多容易看错记错写错;知道了上面的东西 , 多少维都一样,就是一个地址;5,二级指针的用法用内存地址去理解吧,一级指针是指向定义类型的内存地址,二级指针就是指向定义类型的内存地址所指向的新的内存地址 。我举一个例子 。#include <stdio.h>void main()char **p;int n;printf("请输入日期:\n");scanf("%d",&n);printf("对应英语日期:%s\n",*(p n-1));/* *(p n-1)还是指针,指向的n-1位元素的首地址 */}这就是二级指针的用法,定义一个指针数组*day[]里面包含7个字符串,如果你想输出字符串,你就需要一个二级指针,因为一级指针只能寻址到字符串所在的位置,如:n=3,*p则能找到星期三所在的位置而已,并不能将其输出,因为没有其首地址,而**p则完成二级寻址,找到了星期三 , 也找到了它的首地址,所以能输出(字符串输出指针移动是系统自动移动的)指针就是指针,你不要老想着什么二级还是三级,就见怪不怪了比如说,一个链表栈:struct TStackint data;struct TStack * next;};这个链表里面每个元素都是一个struct TStack *指针 。那么怎样写函数,才能通过函数参数进行指针的管理呢?比如两个操作push(top, new_item)和pop(top, new_item),这时就用到了二级指针 。为了便于理解,我们这样定义:typedef struct TStack * PStack ;然后这样定义push:void push(PStack * top, int new_item)PStack n = new PStack;n->data = http://www.lisdn.com/gkrj/shjy/new_item;n->next = *top;*top = n;}这样就通过取参数top的指针完成了对新元素压栈的操作,上面的函数声明等同于void push(struct TStack ** top, int new_item);就是二级指针了 这样的话你用的时候就不用考虑这个栈的第一个元素需不需要初始化的问题int main(void)int data = 0; struct TStack * top = 0;doscanf("%d", &data);push(&top, data); /*注意取指针top的地址*/...} while(data);return 0;}聪明的你一定会问,为什么不能写void push(struct TStack * top, int data)呢?观察程序体就会发现,如果这样写,其实top是不可以被修改的变量,后面的程序虽然 n->next = top没有问题,但是如果想调整top = n就会在编译器上出错,因为top是个地址,在调用函数的时候参数本身不能被修改,除了指针除外所以我们引用二级指针,表示指针本身的地址保持不变 , 其地址指向的内容能为我所用 。不知道您看明白没有?#include<stdio.h>main()int a[5]=int *num[5],i;int **p;for(i=0;i<5;i++)num[i]=&a[i];p=num;for(i=0;i<5;i++)printf("%d ",**p);p++;}}#include<stdio.h>main()char **p;int i;for(i=0;i<5;i++)p=name+i;printf("%s\n",*p);}} 指向指针数据的指针用的是“二级间址”方法,从理论上说,间址方法可以延伸到更多的级,即多重指针 。但实际上在程序中很少有从超过二级间址的 。级数愈多,愈难理解 。

    推荐阅读