在指针 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 条评论) |