int a=1;
int * b=&a;
int **c=&b;
printf("&a:%d\n",&a);
printf("b:%d\n",b);
printf("&b:%d\n",&b);
printf("*b:%d\n",*b);
printf("**c:%d\n",**c);
printf("*c:%d\n",*c);
printf("c:%d\n",c);
printf("&c:%d\n",&c);
运行结果:
在windows下用VS2010开调试:
&a=b=*c=是地址
a=*b=**c=1是数值
&b=c是地址
&c是地址
声明的时候不可以两头有*
一级指针b对应一级指针&a
二级指针c对应二级指针&b
指针要对应级别!
再看字符串
char * a="abc";
char *b=a;
printf("a:%s\n",a);
printf("b:%s\n",b);
输出:
a:abc
b:abc
再看一段程序 理解地址
char * p="a";
char * p1=p;
int a=1;
int *b=&a;
printf("p : %s\n",p);
printf("*p: %d\n",*p);
printf("&p: %d\n",&p);
printf("&p[0]: %d\n",&p[0]);
printf("p1 : %s\n",p1);
printf("*p1: %d\n",*p1);
printf("&p1: %d\n",&p1);
printf("&p1[0]: %d\n",&p1[0]);
printf("*b: %d\n",*b);
printf("b : %d\n",b);
printf("&a: %d\n",&a);
printf("&b: %d\n",&b);
注意:指针指向字符串指针时不带*,而指针指向数值指针时一律&地址
char * menu[]={
"abc",
"def",
"mnp",
NULL,
};
main()
{
char ** opt;
opt=menu;
printf("%d\n",opt);
printf("%s\n",*opt);
}
输出:
134518260
abc
指针的指针作用
只使用指针
swap (int *a,int *b)
{
int c=0;
c=*a;
*a=*b;
*b=c;
}
int main()
{
int a=1;
int c=2;
int *b=&c;
swap(&a,b);
printf("a:%d\n",a);
printf("b:%d\n",*b);
return 0;
}
使用指针的指针
swap (int *a,int **b)
{
int c=0;
c=*a;
*a=**b;
**b=c;
}
int main()
{
int a=1;
int c=2;
int *b=&c;
swap(&a,&b);
printf("a:%d\n",a);
printf("b:%d\n",*b);
return 0;
}
传递的是指针的地址的地址 要用指针的指针,函数调用的时候需要!
不是函数调用,直接赋值即可。