嘘~ 正在从服务器偷取页面 . . .

C语言难点——指针


变量的存储过程和原理

int main (void){
    int a ;
    a = 5;
    printf("a = %d",a);
} 

结果: a = 5

(1)int a;

  • 在栈中定义了一个变量a
  • 在内存中开辟了一个int类型大小的空间
  • 让a指向这片空间

(2) a = 5;

  • 把5转换成二进制
  • 存到a的4个字节的空间

指针类型(int *)的存储过程和原理

int main (void){
    int a;
    int *p;
    p = &a;      
    printf("p = %d\n",*p);
} 

结果: p = 6487572

注意:

int * p,虽然是*p在一起写着,但是变量名叫p,类型为int *,也就是整型的指针类型

(1)int a;

  • 给a在内存中开辟4字节大小的空间

(2)int *p;

  • 给p在内存中开辟4字节大小的空间

(3)p = &a;

  • &a先获得a的地址6487572
  • 然后把6487572转化为二进制
  • 存到p的4个字节的空间

注意:

int *p; 变量名叫p,类型为int *,可存放一个int数据的地址 。

指针类型(int **)的存储过程和原理

int main (void){
    int a;
    int *p;
    int **q;
    p = &a;
    q = &p;  
    printf("p = %d\n",p);
    printf("q = %d\n",q);    
} 

结果:
p = 6487572
q = 6487560

int ** q; 变量名为q,数据类型为int **

int *中存放的是int类型数据的地址

int **中存放的是int类型数据的地址的地址

他们的指向关系如下 :

a<—-p<—-q

指针类型(int ***)的存储过程和原理

int main (void){
    int a;
    int *p;
    int **q;
    int ***m;
    p = &a;
    q = &p;
    m = &q;
    printf("q = %d\n",q);      
    printf("p = %d\n",p);
    printf("m = %d\n",m);
} 

结果:
q = 6487560
p = 6487572
m = 6487552

既然,int 和int * 都懂了,那么int ***就迎刃而解了

同理,int ** * 存放的是 int **类型数据的地址

指针操作(*操作)

int main (void){
    int a;
    int *p;
    int **q;
    int ***m;
    p = &a;
    q = &p;
    m = &q;
    printf("p = %d\n",p);
    printf("*p = %d\n",*p);
    printf("q = %d\n",q);
    printf("*q = %d\n",*q);
    printf("**q = %d\n",**q);
    printf("m = %d\n",m);
    printf("*m = %d\n",*m);
    printf("**m = %d\n",**m);
    printf("***m = %d\n",***m);
} 

结果:

p = 6487572
*p = 0
q = 6487560
*q = 6487572
**q = 0
m = 6487552
*m = 6487560
**m = 6487572
***m = 0

简而言之,* 操作就是取值操作,即取出指针变量存放的地址中所存放的数据

(1)*p ;

  • 先看成*(p),再从里向外看
  • 首先他有一个变量p,所以直接可以先从内存中拿到p存放的数据6487572(a的地址),
  • 再找到内存中6487572那片内存
  • 最后取出6487572中的存放数据

(2)**q ;

  • 先看成 *( * (q)),再从里向外看
  • 从内存中拿到q存放的数据6487572
  • 再从内存中找到6487572那片内存
  • 取出存放的数据6487572,这时已经完成了 * (q)操作
  • 之后从内存中找到6487572那片内存,
  • 取出存放的数据

(3)***m = 5

  • 先看成 *( * ( * (m) ) ),再从里向外看
  • 先从内存中拿到m存放的数据6487552
  • 再从内存中找到6487552那片内存
  • 取出存放的数据6487560,这时已经完成了* (m)操作
  • 再从内存中找到6487560那片内存
  • 取出存放的数据6487572,完成了 * ( * (m ) )操作
  • 再从内存中找到6487572那片内存
  • 取出存放的数据,完成了 * ( * ( *(m) ) )操作

参考文献

C语言重点——指针篇(一篇让你完全搞懂指针)

如果有其他问题欢迎留言或邮件提问

QQ:1269112498

Email:1269112498@qq.com

相关文章


文章作者: 刘天翼
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 刘天翼 !
评论
  目录