C语言题解:p1 = p2 与 *p1 = *p2

简介: C语言题解:p1 = p2 与 *p1 = *p2

hello , 今天给大家分享一道简单C语言试题,温故知新。


问题:给定两个指针p1 和 p2(不为空), p1 = p2*p1 = *p2 是一样的吗?


考察知识点:指针理解、左值、右值。


思路


对于这道题,容易出现误区:看表象,两者输出结果一致,认为是一样的操作。


p1 = p2:很好理解,将p1 指向p2,即p1 和 p2 同时指向p2地址处,覆盖了原来p1的值。


*p1 = *p2:表示将p2 指向的内容 赋值给p1 指向的内容,指针本身的地址不变。


p1 = p2


源代码:改变的是地址


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _student {
    int id; 
    int age;
    char name[32];
    float score;
} student_t;
static void dump_info(student_t *pstu)                       
{
    printf("INFO(%s): student->id = %d\n", __func__, pstu->id);
    printf("INFO(%s): student->age = %d\n", __func__, pstu->age);
    printf("INFO(%s): student->name = %s\n", __func__, pstu->name);
    printf("INFO(%s): student->score = %f\n", __func__, pstu->score);
}
int main()
{
    student_t *p1 = NULL;
    student_t *p2 = NULL;
    p1 = (student_t*)malloc(sizeof(student_t));
    if (!p1) {
        printf("ERROR(%s):malloc for p1 error\n", __func__);
        return -1;
    }
    p2 = (student_t*)malloc(sizeof(student_t));
    if (!p1) {
        printf("ERROR(%s):malloc for p1 error\n", __func__);
        return -1;
    }
    p1->id = 1;
    p1->age = 21;
    strcpy(p1->name, "stu1");
    p1->score = 90.0;
    p2->id = 2;
    p2->age = 25;
    strcpy(p1->name, "stu2");
    p2->score = 100.0;
    printf("INFO(%s): $$$$$$$$$$$ before $$$$$$$$$$ \n", __func__);
    printf("INFO(%s): p1 = %p \n",__func__, p1);
    printf("INFO(%s): p2 = %p \n",__func__, p2);
    dump_info(p1);
    dump_info(p2);
    p1 = p2;
    printf("INFO(%s): $$$$$$$$$$$ p1 = p2 $$$$$$$$$$ \n", __func__);
    printf("INFO(%s): p1 = %p \n",__func__, p1);
    printf("INFO(%s): p2 = %p \n",__func__, p2);
    dump_info(p1);
    dump_info(p2);
    return 0;
}


输出结果:p1 的地址被覆盖了,变成p2.


INFO(main): $$$$$$$$$$$ before $$$$$$$$$$ 
INFO(main): p1 = 0xd65010 
INFO(main): p2 = 0xd65050 
INFO(dump_info): student->id = 1
INFO(dump_info): student->age = 21
INFO(dump_info): student->name = stu2
INFO(dump_info): student->score = 90.000000
INFO(dump_info): student->id = 2
INFO(dump_info): student->age = 25
INFO(dump_info): student->name = 
INFO(dump_info): student->score = 100.000000
INFO(main): $$$$$$$$$$$ p1 = p2 $$$$$$$$$$ 
INFO(main): p1 = 0xd65050 
INFO(main): p2 = 0xd65050 
INFO(dump_info): student->id = 2
INFO(dump_info): student->age = 25
INFO(dump_info): student->name = 
INFO(dump_info): student->score = 100.000000
INFO(dump_info): student->id = 2
INFO(dump_info): student->age = 25
INFO(dump_info): student->name = 
INFO(dump_info): student->score = 100.000000


*p1 = *p2


源代码:改变的是指向的内容


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _student {
    int id; 
    int age;
    char name[32];
    float score;
} student_t;
static void dump_info(student_t *pstu)                      
{
    printf("INFO(%s): student->id = %d\n", __func__, pstu->id);
    printf("INFO(%s): student->age = %d\n", __func__, pstu->age);
    printf("INFO(%s): student->name = %s\n", __func__, pstu->name);
    printf("INFO(%s): student->score = %f\n", __func__, pstu->score);
}
int main()
{
    student_t *p1 = NULL;
    student_t *p2 = NULL;
    p1 = (student_t*)malloc(sizeof(student_t));
    if (!p1) {
            printf("ERROR(%s):malloc for p1 error\n", __func__);
            return -1;
    }
    p2 = (student_t*)malloc(sizeof(student_t));
    if (!p1) {
            printf("ERROR(%s):malloc for p1 error\n", __func__);
            return -1;
    }
    p1->id = 1;
    p1->age = 21;
    strcpy(p1->name, "stu1");
    p1->score = 90.0;
    p2->id = 2;
    p2->age = 25;
    strcpy(p1->name, "stu2");
    p2->score = 100.0;
    printf("INFO(%s): $$$$$$$$$$$ before $$$$$$$$$$ \n", __func__);
    printf("INFO(%s): p1 = %p \n",__func__, p1);
    printf("INFO(%s): p2 = %p \n",__func__, p2);
    dump_info(p1);
    dump_info(p2);
    *p1 = *p2;
    printf("INFO(%s): $$$$$$$$$$$ p1 = p2 $$$$$$$$$$ \n", __func__);
    printf("INFO(%s): p1 = %p \n",__func__, p1);
    printf("INFO(%s): p2 = %p \n",__func__, p2);
    dump_info(p1);
    dump_info(p2);
    return 0;
}


输出结果:p1 和 p2 的地址不变,p1 指向的内容被覆盖了


INFO(main): $$$$$$$$$$$ before $$$$$$$$$$ 
INFO(main): p1 = 0x20d2010 
INFO(main): p2 = 0x20d2050 
INFO(dump_info): student->id = 1
INFO(dump_info): student->age = 21
INFO(dump_info): student->name = stu2
INFO(dump_info): student->score = 90.000000
INFO(dump_info): student->id = 2
INFO(dump_info): student->age = 25
INFO(dump_info): student->name = 
INFO(dump_info): student->score = 100.000000
INFO(main): $$$$$$$$$$$ p1 = p2 $$$$$$$$$$ 
INFO(main): p1 = 0x20d2010 
INFO(main): p2 = 0x20d2050 
INFO(dump_info): student->id = 2
INFO(dump_info): student->age = 25
INFO(dump_info): student->name = 
INFO(dump_info): student->score = 100.000000
INFO(dump_info): student->id = 2
INFO(dump_info): student->age = 25
INFO(dump_info): student->name = 
INFO(dump_info): student->score = 100.000000


总结


本文简单温故一下知识的用法。对于p1 = p2 和 *p1 = *p2,只需要把握变化的地方就行。


  • p1 = p2: 改变的是指针地址。所以指向内容也跟着变了。


  • *p1 = *p2:改变的是指针指向的内容,指针本身地址不变。
相关文章
|
C语言
|
Java 编译器 C语言
C语言学习笔记—P1(<C语言初阶>+<数据类型>+图解+题例)
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
95 0
C语言学习笔记—P1(<C语言初阶>+<数据类型>+图解+题例)
|
Java 程序员 编译器
《C语言深度剖析》第五章 内存管理 p1(完结)( C语言从入门到入土(进阶篇)(二)
本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始!
《C语言深度剖析》第五章 内存管理 p1(完结)( C语言从入门到入土(进阶篇)(二)
|
程序员 C语言
《C语言深度剖析》第五章 内存管理 p1(完结)( C语言从入门到入土(进阶篇)(一)
本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始!
《C语言深度剖析》第五章 内存管理 p1(完结)( C语言从入门到入土(进阶篇)(一)
|
编译器 C语言
《C语言深度剖析》第六章 函数栈帧与可变参数列表 p1可变参数列表(完结)( C语言从入门到入土(进阶篇)
《C语言深度剖析》第六章 函数栈帧与可变参数列表 p1可变参数列表(完结)( C语言从入门到入土(进阶篇)
《C语言深度剖析》第六章 函数栈帧与可变参数列表 p1可变参数列表(完结)( C语言从入门到入土(进阶篇)
《C语言深度剖析》第六章 函数栈帧与可变参数列表 p1函数栈帧(完结)( C语言从入门到入土(进阶篇)
《C语言深度剖析》第六章 函数栈帧与可变参数列表 p1函数栈帧(完结)( C语言从入门到入土(进阶篇)
《C语言深度剖析》第六章 函数栈帧与可变参数列表 p1函数栈帧(完结)( C语言从入门到入土(进阶篇)
《C语言深度剖析》第四章 指针和数组 p2 C语言从入门到入土(进阶篇)
本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始!
《C语言深度剖析》第四章 指针和数组 p2 C语言从入门到入土(进阶篇)
|
存储 安全 编译器
《C语言深度剖析》第四章 指针和数组 p1 C语言从入门到入土(进阶篇)(二)
本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始!
《C语言深度剖析》第四章 指针和数组 p1 C语言从入门到入土(进阶篇)(二)
《C语言深度剖析》第四章 指针和数组 p1 C语言从入门到入土(进阶篇)(一)
本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始!
《C语言深度剖析》第四章 指针和数组 p1 C语言从入门到入土(进阶篇)(一)
|
编译器 Linux C语言
《C语言深度剖析》第三章 预处理详解 p2(完结) C语言从入门到入土(进阶篇)(二)
本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始!
《C语言深度剖析》第三章 预处理详解 p2(完结) C语言从入门到入土(进阶篇)(二)