指针--

来源:互联网 发布:淘宝国际版官方网站 编辑:程序博客网 时间:2024/05/20 18:47
 

说透指针

分类: C基础 5918人阅读 评论(4)收藏 举报
view plaincopy to clipboardprint?
  1. int a=1;  
  2. int * b=&a;  
  3. int **c=&b;  
  4. printf("&a:%d\n",&a);  
  5. printf("b:%d\n",b);  
  6. printf("&b:%d\n",&b);  
  7. printf("*b:%d\n",*b);  
  8. printf("**c:%d\n",**c);  
  9. printf("*c:%d\n",*c);  
  10. printf("c:%d\n",c);  
  11. printf("&c:%d\n",&c);  


运行结果:

在windows下用VS2010开调试:


&a=b=*c=是地址

a=*b=**c=1是数值

&b=c是地址

&c是地址

 声明的时候不可以两头有*

 

一级指针b对应一级指针&a

二级指针c对应二级指针&b

指针要对应级别!

 

再看字符串

view plaincopy to clipboardprint?
  1. char * a="abc";  
  2. char *b=a;  
  3. printf("a:%s\n",a);  
  4. printf("b:%s\n",b);  


输出:

a:abc

b:abc

 

再看一段程序 理解地址

view plaincopy to clipboardprint?
  1. char * p="a";  
  2. char * p1=p;  
  3. int a=1;  
  4. int *b=&a;  
  5. printf("p : %s\n",p);  
  6. printf("*p: %d\n",*p);  
  7. printf("&p: %d\n",&p);  
  8. printf("&p[0]: %d\n",&p[0]);  
  9.   
  10. printf("p1 : %s\n",p1);  
  11. printf("*p1: %d\n",*p1);  
  12. printf("&p1: %d\n",&p1);  
  13. printf("&p1[0]: %d\n",&p1[0]);  
  14.   
  15. printf("*b: %d\n",*b);  
  16. printf("b : %d\n",b);  
  17. printf("&a: %d\n",&a);  
  18. 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

 

指针的指针作用

 

只使用指针

view plaincopy to clipboardprint?
  1. swap (int *a,int *b)  
  2. {  
  3. int c=0;  
  4. c=*a;  
  5. *a=*b;  
  6. *b=c;  
  7. }  
  8. int main()  
  9. {  
  10. int  a=1;  
  11. int  c=2;  
  12. int  *b=&c;  
  13.   
  14. swap(&a,b);  
  15.         printf("a:%d\n",a);  
  16.         printf("b:%d\n",*b);  
  17.         return 0;  
  18.   
  19. }  


使用指针的指针

view plaincopy to clipboardprint?
  1. swap (int *a,int **b)  
  2. {  
  3. int c=0;  
  4. c=*a;  
  5. *a=**b;  
  6. **b=c;  
  7. }  
  8. int main()  
  9. {  
  10. int  a=1;  
  11. int  c=2;  
  12. int  *b=&c;  
  13.   
  14. swap(&a,&b);  
  15.         printf("a:%d\n",a);  
  16.         printf("b:%d\n",*b);  
  17.         return 0;  
  18.   
  19. }  


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

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

 

=================================================================

 

11.指针

指针只能指向地址!

指针的指针是为了取得“地址”,因为指针只是指向“主体”

int  a;

int *b=&a;

int **c=&b;

a=1;

*b=2;

指针要对应级别,一级b对应一级&a,二级c对应二级&b。

如果传值原代码块无星

main()

{

swap(a,b,c)

}

swap(int a,int *b,int **c)

{

a=*b+**c;//这样不能改变值

*b=a+**c;//可以改变值

}

函数里要改变原值只有指针

printf("%d",*b);//输出2

printf("%d",a);//输出2

//指针和字符串

char * ch="abc";

char * cp=ch;

printf("%s",cp);//输出abc

//指针和字符

char  ch=‘a’;

char * cp=&ch;

printf("%c",*cp);//输出a

 

 

=======================================================================

25.字符串

类型一:字符串

char day[15] = "abcdefghijklmn";//定义一

char day[] = "abcdefghijklmn";//定义一
char * str="abcdefghijklmn";//定义二

windows下VS2010调试窗口看区别


char str[20]="0123456789";//str是编译期大小已经固定的数组
int a=strlen(str); //a=10;//strlen()在运行起确定
int b=sizeof(str); //而b=20;//sizeof()在编译期确定

sizeof 运算符是用来求内存容量字节的大小的。而strlen是用来求字符串实际长度的。

下面2种声明完全一样

类型二:字符数组

char msg[]={'a','b','c'}

char msg[]={abc}

char *ans;

ans=strchr(day,'c');

printf("%s",ans);//输出从c开始的部分

printf("%d",*ans);//输出找到的指针

ans=strrchr(day,'c');

printf("%s",ans);//输出找到的指针

printf("%d",*ans);//输出找到的指针

 

char temp[100]="hello";

char *t="world";

strcat(temp,t);

输出 temp

要注意的是 第一个参数数组长度要=自身原长+合并字符长

 

类型三:字符串数组

char *a[4]={"this","is","a","test"};
char **p=a;

 

 

===========================================================================

 

 

原创粉丝点击