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


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

#include <stdio.h>
int main()
{
    int i;  //默认初始化为0
    int *p=&i;
    int *qtest;
    qtest = p;
    *qtest = 3;
    printf("&i:%p\n",&i);  //打印int变量i的地址
    printf("&:%p\n",&p);  //打印int指针变量p的地址
    printf("p:%p\n",p);   //打印p本身的内容(地址)
    printf("*p:%d\n",*p);  //打印p本地代表的内存地址指向的值,即i的值。
    printf("\n");
/*****************************/
    int *s;
    s = &i;
    int k = *s;
    printf("&k:%p\n",&k);   //打印s本身的内容(地址)
    printf("k:%d\n",k);  //打印s本地代表的内存地址指向的值,即i的值。
    printf("&i:%p\n",&i);  //打印int变量i的地址
    printf("&s:%p\n",&s);  //打印int指针变量s的地址
    printf("s:%p\n",s);   //打印s本身的内容(地址)
    printf("*s:%d\n",*s);  //打印s本地代表的内存地址指向的值,即i的值。
    printf("\n");
/*****************************/
    s = (int *) 0x7fff5f535f00;
    printf("s:%p\n",s);   //打印s本身的内容(地址)
    printf("\n");
/*****************************/
    char *ch;
    char *cha;
    ch = "dfdf";
    cha = ch;
    printf("s:ch:%s\n", ch);
    printf("p:ch:%p\n", ch);
    printf("s:cha:%s\n", cha);
    printf("p:cha:%p\n", cha);
    printf("p:*cha:%c\n", *cha);
/*****************************/
    printf("\n");
    char *chi = "fffd";// char *chi; chi = "fffd";
    printf("s:chi:%s\n", chi);
    printf("p:chi:%p\n", chi);
    printf("p:*chi:%c\n", *chi);
    printf("\n");
/*****************************/
   char a[] = "i love china";
   char *array;
   array = &a[0];//array = &a[0];//array = a[0];//array = a;
   printf("p:chi:%c\n", *array);
   printf("p:*chi:%s\n", array);
   *(array + 2) = 'f';
   printf("p:chi:%c\n", *array);
   printf("p:*chi:%s\n", 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';