C语言指针轻松入门

& 表示取地址

* 表示取值


常量指针

指向一个常量的指针

    int a = 4;
    int b = 6;
    int const *p = &a;    //常量指针
    *p = 66; // 不能修改,指向的值是个常量(不能通过指针改变)(只可以读取,不可改变,函数参数chage(int const *p))
    a = 44;    // 变量自身可以修改    p = &b;
指针常量
一个常量的值时指针;
     int c = 66;
    int d = 99;
    int *const pn = &c;
    c = 100;    // 可以修改
  //  pn = &d;    // 不可以修改,因为 指针pn是常量类型的指针
    *pn = 1010;    // 可以通过指针修改指向的值
    printf("%d",c);
指向常量的指针常量
------------------------------------------------------

const(*号)左边放,我是指针变量指向常量

const(*号)右边放,我是指针常量指向变量

const(*号)两边放,我是指针常量指向常量

指针变量能改指向,指针常量不能转向!

要是全都变成常量,锁死了,我不能转向,你也甭想变样!

----------------------------------------------------------------

指针指向多维数组

int map[4][3] = {
    {1,2,3},
    {4,5,6},
    {7,8,9},
    {17,18,19}
}
int (*p)[3] = map;

p指针可以看做这样一个形式:

p[3] = map地址{

    map[0]地址,

    map[1]地址

    map[2]地址

}

map  地址:保存的是map[0]的地址,map[0]地址也是取map[0][0]来保存的。

*map 地址: 保存的是map[0][0]的地址, 虽然地址与map相同但是占用大小不同
p :同上

*p:同上

*map+1  :  取得值是map[0][1]的一个地址。

*p+1:同上

map+1 :    取得值是map[1] / map[1][0]的一个地址
p+1 : 同上

*(map+1): 先取得map[1][0]的地址,再取值    , = 4

   //地址相同
    printf("p:\t%p\n", p);
    printf("map:\t%p\n", map);
    printf("*map:\t%p\n", *map);
    printf("*p:\t%p\n", *p);
 //地址相同
    printf("map+1:\t%p\n", map+1);
    printf("*(map+1):\t%p\n",*(map+1));
    printf("p+1:\t%p\n",p+1);
    printf("*(p+1):\t%p\n", *(p+1));
 //地址相同
    printf("*p+1:\t%p\n", *p+1);
    printf("*map+1:\t%p\n", *map+1);



详细代码

  int map[4][3] = {
        {1,2,3},
        {4,5,6},
        {14,15,16},
        {7,8,9}
    };
    int (*p)[3] = map;

    printf("%d\n", *(*p+1));
    printf("%d\n", *(*(p+1)));
    printf("%d\n", *(*(map+1)));

    printf("p:\t%p\n", p);
    printf("map:\t%p\n", map);
    printf("*map:\t%p\n", *map);
    printf("*p:\t%p\n", *p);
    printf("map+1:\t%p\n", map+1);
    printf("*(map+1):\t%p\n",*(map+1));
    printf("p+1:\t%p\n",p+1);
    printf("*(p+1):\t%p\n", *(p+1));
    printf("*p+1:\t%p\n", *p+1);
    printf("*map+1:\t%p\n", *map+1);


本文出自 “90设计工作室” 博客,转载请与作者联系!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。