说透指针

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;

}


 传递的是指针的地址的地址 要用指针的指针,函数调用的时候需要!

不是函数调用,直接赋值即可。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值