c语言指针学习总结

阅读: 评论:0

c语言指针学习总结

c语言指针学习总结


在指针 int *p或char *p,中*p是内容,p是指针,调用`*p`时候类似间接寻址


先看个简单 指针实验:在linux上gcc编译运行

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 #include <stdio.h> int  main() {      int  i;   //默认初始化为0      int  *p=&i;      int  *qtest;      qtest = p;      *qtest = 3;      printf ( "&i:%pn" ,&i);   //打印int变量i的地址      printf ( "&:%pn" ,&p);   //打印int指针变量p的地址      printf ( "p:%pn" ,p);    //打印p本身的内容(地址)      printf ( "*p:%dn" ,*p);   //打印p本地代表的内存地址指向的值,即i的值。      printf ( "n" ); /*****************************/      int  *s;      s = &i;      int  k = *s;      printf ( "&k:%pn" ,&k);    //打印s本身的内容(地址)      printf ( "k:%dn" ,k);   //打印s本地代表的内存地址指向的值,即i的值。      printf ( "&i:%pn" ,&i);   //打印int变量i的地址      printf ( "&s:%pn" ,&s);   //打印int指针变量s的地址      printf ( "s:%pn" ,s);    //打印s本身的内容(地址)      printf ( "*s:%dn" ,*s);   //打印s本地代表的内存地址指向的值,即i的值。      printf ( "n" ); /*****************************/      s = ( int  *) 0x7fff5f535f00;      printf ( "s:%pn" ,s);    //打印s本身的内容(地址)      printf ( "n" ); /*****************************/      char  *ch;      char  *cha;      ch =  "dfdf" ;      cha = ch;      printf ( "s:ch:%sn" , ch);      printf ( "p:ch:%pn" , ch);      printf ( "s:cha:%sn" , cha);      printf ( "p:cha:%pn" , cha);      printf ( "p:*cha:%cn" , *cha); /*****************************/      printf ( "n" );      char  *chi =  "fffd" ; // char *chi; chi = "fffd";      printf ( "s:chi:%sn" , chi);      printf ( "p:chi:%pn" , chi);      printf ( "p:*chi:%cn" , *chi);      printf ( "n" ); /*****************************/     char  a[] =  "i love china" ;     char  *array;     array = &a[0]; //array = &a[0];//array = a[0];//array = a;     printf ( "p:chi:%cn" , *array);     printf ( "p:*chi:%sn" , array);     *(array + 2) =  'f' ;     printf ( "p:chi:%cn" , *array);     printf ( "p:*chi:%sn" , array);      return  1;                 }




linux上对应结果为

&i:0x7fff851b2e90
&p:0x7fff851b2e98
p:0x7fff851b2e90
*p:118


&k:0x7fff851b2e94
k:118
&i:0x7fff851b2e90 
&s:0x7fff851b2ea0
s:0x7fff851b2e90
*s:118
/*从上面两部分结果可以看出内存组织如下:(从绿色字体可以看出)从内存0x7fff851b2e90 处开始4个Byte存放int变量i,接下来4个Byte存放int变量k;(从上面黑色加粗字体)从0x7fff851b2e98开始的8个Byte开始int指针变量p的值,而这个值对应的内存单元在使用*p取值时只会取4个Byte。调用i时候类似直接寻址,调用`*p`时候类似间接寻址。*/


s:ch:dfdf
p:ch:0x40098f
s:cha:dfdf
p:cha:0x40098f
p:*cha:d

s:chi:fffd
p:chi:0x4009c5
p:*chi:f

p:chi:i
p:*chi:i love china
p:chi:i
p:*chi:i fove china


总结

一、

   *p 是p所在值得内容,使用值、用内容;?=*p

   p是地址,赋值用地址;p=?

   int *p 是8位byte;int 是4位bite

   char*p 是4位bite; char 是2位bite      



   int *p,*q;

   int a = 4;

   p = &a;//直接赋值(赋地址);

   *p = 4;//(间接赋值)

   *p 相当于 a; *p = 4;相当于 a = 4;

   q = p;//直接赋值(赋地址);    

   char *p = "i lova china";//间接赋值(地址)

   char *q;

   q = p;直接赋值(赋地址):





二、

   下面赋值错误:数据类型不一样

   int *p = 9;

   p = 8;//如果正确应该是p=(int*)8;


   p是地址;赋值用地址

   char *p;

   *p = "i love china";  //错误


   下面正确

   char *p = "i love china";

   p = "i love china";


三、int i = 9;

int *p;

p = &i;(直接赋值,赋地址)


int a;

int *p;

p = &a;(同上)

p = (int *)0x56000056;(这句在arm嵌入式学习中用到,在计算机中并不合法)

p = ox10 <==> a = 0x100; <==> (*(int *) 0x56000056) = 0x100;

四、

   数组中

   string[4] 等同于 *(string + 4)

   所以下面正确

    一、

   char a[] = "i love china";

     char *array;

   array = &a[0];//array = &a[0];//array = a[0];//array = a;

       *(array + 2) = 'f';



本文转自lilin9105 51CTO博客,原文链接:,如需转载请自行联系原作者

本文发布于:2024-01-30 19:32:17,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170661434022314.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:指针   语言
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23