原创作品,转载请标明出处
http://blog.csdn.net/yming0221/article/details/7220688
输出的结构如下:
二级指针又叫双指针。C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针。C++中可以使用引用类型来实现。
下面讲解C中的二级指针的使用方法。
例如我们使用指针来交换两个整型变量的值。
错误代码如下:
一级指针
- #include <stdio.h>
- void swap(int *a,int *b)
- {
- int *tmp=NULL;
- tmp=a;
- a=b;
- b=tmp;
- }
- int main(int argc,char **argv)
- {
- int a=2;
- int b=3;
- printf("Before swap a=%d b=%d\n",a,b);
- swap(&a,&b);
- printf("After swap a=%d b=%d\n",a,b);
- return 0;
- }
输出的结构如下:
结果分析:不论是数值还是指针,swap函数中的参数传递的是总是值,所以在上述函数中即使a和b的地址已参数传递给swap函数,而在函数内交换的是a和b的值(main函数中a的地址和b的地址),而交换完毕,函数相应的参数从栈中弹出,并不能返回给调用函数,所以该swap函数中的操作是徒劳。
这里完全可以直接交换a和b的值,不过如果a和b不是一个32位的整型变量,而是一个复杂的数据结构,这样做会降低效率。如下;
- void swap(TYPE *a,TYPE *b)
- {
- TYPE tmp;
- tmp=*a;
- *a=*b;
- *b=tmp;
- }
二级指针
下面是使用二级指针分配内存的例子
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void memorylocate(char **ptr)
- {
- *ptr=(char *)malloc(10*sizeof(char));
- }
- int main(int argc,char **argv)
- {
- char *buffer;
- memorylocate(&buffer);
- strcpy(buffer,"12345");
- printf("buffer %s\n",buffer);
- return 0;
- }
当想改变指针的值的时候不妨考虑使用二维指针。
-
19楼
youbuxiaosan 4小时前发表 [回复] [引用] [举报]
-
-
#include <stdio.h>
void swap(int **a,int **b)
{
int temp = **a;
**a = **b;
**b = temp;
}
int main()
{
int i = 1;
int j = 2;
int *p1 = &i;
int *p2 = &j;
int *a = p1;
int *b = p2;
swap(&a,&b);
printf("a = %d,b = %d\n",*a,*b);
return 0;
}
-
15楼
awfty 前天 13:57发表 [回复] [引用] [举报]
-
-
二维数组不能用二级指针
-
Re:
alex_xhl 前天 15:33发表 [回复] [引用] [举报]
-
-
回复awfty:下面的程序算二维数组使用二级指针吗?
#include <stdio.h>
void modifyElement(int **p)
{
**p = 1;
}
int main(void)
{
int a[2][3] = {0, 0, 0, 0, 0, 0};
int i = 0;
int j = 0;
int *p = (int *)&a[0][0];
printf("Before modify: \n");
for(i = 0; i < 2; i++)
{
for(j = 0; j < 3; j++)
{
printf("a[%d][%d] = %d ", i, j, a [j] );
}
}
printf("\n");
modifyElement((int **)&p);
printf("After modify: \n");
for(i = 0; i < 2; i++)
{
for(j = 0; j < 3; j++)
{
printf("a[%d][%d] = %d ", i, j, a[j] );
}
}
printf("\n");
return 0;
}
运行结果:
Before modify:
a[0][0] = 0 a[0][1] = 0 a[0][2] = 0 a[1][0] = 0 a[1][1] = 0 a[1][2] = 0
After modify:
a[0][0] = 1 a[0][1] = 0 a[0][2] = 0 a[1][0] = 0 a[1][1] = 0 a[1][2] = 0
-
-
13楼
Huangpc123 4天前 12:13发表 [回复] [引用] [举报]
-
- int *a写成int* a比较好,这样说明声明的是a的变量的内存,而不是*a的内存,如果直接访问*a,是要出错的
-
12楼
yeenfei 4天前 09:56发表 [回复] [引用] [举报]
-
-
"当操作二维数组时传递参数"
这个可不一定,要看是什么二维法。。。
如 int array[3][3];
对于电脑来讲,数据都是连续的(contiguous)
-
11楼
guanzhongw 4天前 09:16发表 [回复] [引用] [举报]
-
-
void swap( int &a , int &b )
{
int p = 0 ;
p = a ;
a = b ;
printf( "swap a=%d\n", a) ;
b = p ;
printf("swap b=%d\n", b);
}
int _tmain(int argc, _TCHAR* argv[])
{
int a = 2 ;
int b = 3 ;
printf("before swap a=%d,b=%d\n", a,b) ;
swap( a , b ) ;
printf("after swap a=%d,b=%d", a,b) ;
getchar() ;
return 0;
}
-
9楼
Mrs_chengj 4天前 21:57发表 [回复] [引用] [举报]
-
- 给来个小项目,给我练练可以吗,不然水平提不高啊。可以的话发到这个邮箱Mrs_chengj@yeah.net,谢谢了
-
8楼
intel286 4天前 21:26发表 [回复] [引用] [举报]
-
-
C语言教材里有
void swap(int *a,int *b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
这个例题
-
7楼
aoyihuashao 5天前 14:29发表 [回复] [引用] [举报]
-
- 这专家过计算机2级没? 这东西2级应该考的吧,专家今天才发现啊
-
6楼
backspace7 5天前 12:33发表 [回复] [引用] [举报]
-
-
void swap(int *a,int *b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
-
5楼
JAVA2010CZP 5天前 12:25发表 [回复] [引用] [举报]
-
- 2
-
3楼
userlll1986 5天前 12:19发表 [回复] [引用] [举报]
-
- 太二了,上首页,让人失望啊!!!!
-
2楼
sqfasd 5天前 12:02发表 [回复] [引用] [举报]
-
-
博主,你确定二级指针是这样用吗,你确定你不是在误导人吗?
swap函数的形参是二级指针,但是你传实参的时候明显是个一级指针啊,这样编译都会有警告(我是mingwin gcc 默认编译)。
正确的应该是这样
#include <stdio.h>
void swap(int *a, int *b)
{
int tmp;
printf("swap(): a=%#x, b=%#x\n", a, b);
printf("swap(): &a=%#x, &b=%#x\n", &a, &b);
tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 2;
int b = 3;
printf("main(): &a=%#x, &b=%#x\n", &a, &b);
swap(&a, &b);
printf("main(): after swap a=%d,b=%d\n", a, b);
return 0;
}
输出结果:
main(): &a=0x22ff4c, &b=0x22ff48
swap(): a=0x22ff4c, b=0x22ff48
swap(): &a=0x22ff30, &b=0x22ff34
main(): after swap a=3,b=2
看看打印的地址就明白了,指针跟普通变量一样,只不过它的值是另外一个变量的地址,指针本身也会有地址。通过*对指针解引用后就可以得到指针指向的那个变量的值,再做修改就可以了。