【c/c++】指针例图基础详解

发布时间:2023年12月30日

指针变量内存

int main(){
    // 各类型变量占字节数
    printf("char:   %d\n",sizeof(char));	// 1
    printf("short:  %d\n",sizeof(short));	// 2
    printf("int:    %d\n",sizeof(int));		// 4
    printf("float:  %d\n",sizeof(float));	// 4
    printf("double: %d\n",sizeof(double));	// 8

    printf("\n");

    // 各类型指针变量(不论几级指针)占8字节(64位系统)
    printf("char*:  %d\n",sizeof(char*));
    printf("short*: %d\n",sizeof(short*));
    printf("int*:   %d\n",sizeof(int*));
    printf("float*: %d\n",sizeof(float*));
    printf("double*:%d\n",sizeof(double*));
    
    // 各类型指针变量(不论几级指针)占4字节(32位系统)
    
    return 0;
}

指针详解

&:取地址
*:解引用(指向值)

例1

在计算机内存中,变量的内存基本上都由一段连续的内存空间组成,所以变量的地址指开辟空间的首地址

int main() {
    int a = 10;
    // 指针==地址
    int *p = &a;    // p 指针变量
    printf("*p->  %d\n", *p);
    return 0;
}

在这里插入图片描述

在这里插入图片描述

例2

在计算机内存中,肯定不会有图例的箭头,所以*p就代表指向的内容

int main() {
    int a = 10;
    int b = 20;
    
    int *p = NULL;
    int **s = NULL;
    
    p = &a;
    s = &p;
    
    return 0;
}

在这里插入图片描述

练习&答案解析

请依次写出执行语句1和语句2后&p*pp**s*s&ss的值

int main() {
    int a = 10;	// 已知--&a:0xed209ffa94
    int b = 20;	// 已知--&b:0xed209ffa90
    int *p = NULL;
    int **s = NULL;
    p = &a;	// 已知--&p:0xed209ffa88
    s = &p;	// 已知--&s:0xed209ffa98

    *p = 100;	// 语句1
    *s = &b;	// 语句2
    
    return 0;
}

答案&解析:

1.执行完*p = 100
&p :0xed209ffa88——指针变量p的地址
*p :100——语句1相当于执行a=100,改变了a的值,*p就是a
p : &a 或 0xed209ffa94——变量a的地址 赋值给 指针变量p自身的值

&s :0xed209ffa98——指针变量s的地址
*s :&a 或 0xed209ffa94——指针变量p自身的值,变量a的地址
**s:100——**s相当于*p,执行了语句1之后,*p=100,所以**s=100
s :0xed209ffa88

2.执行完*s = &b
&s :0xed209ffa98——指针变量p的地址
*s : &b 或 0xed209ffa90——执行了语句2之后,变量b的地址 赋值给 指针变量s指向的值*s相当于指针变量p自身的值,所以相当于让指针变量p指向变量b,相当于p=&b,相当于*p=20
**s :20——**s相当于*p,指针变量p指向的值,由上面*s的解析内容可得
s : &p 或 0xed209ffa88——指针变量p的地址 赋值给 指针变量s自身的值

&p :0xed209ffa88——指针变量p的地址
*p :20——根据上面*s的解析内容可得
p : &b 或 0xed209ffa90——根据上面*s的解析内容可得

文章来源:https://blog.csdn.net/qq_46033586/article/details/135300252
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。