鱼C论坛

 找回密码
 立即注册
查看: 96|回复: 1

[学习笔记] 每日一学31

[复制链接]
发表于 2025-1-3 11:20:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
指针4

指针表达式

一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。下面是一些指针表达式的例子。

    int a,b;

    int array[10];

    int *pa;

    pa = &a;    //&a是一个指针表达式

    int **ptr = &pa;    //&pa也是指针表达式

    *ptr = &b;  //*ptr和&b都是指针表达式

    pa = array;

    pa++;   //这也是指针表达式

    char *arr[20];

    char **parr = arr;    //如果把arr看作指针的话,arr也是指针表达式

    char *str;

    str = *parr;    //*parr是指针表达式

    str = *(parr+1);  //*(parr+1)是表达式

    str = *(parr+2);  //*(parr+2)是表达式

由于指针表达式的结果是一个指针,因此指针表达式也具有指针所具有的4个要素,即指针的类型、指针所指向的类型、指针指向的内存区、指针自身占据的内存。
当一个指针表达式的结果指针已经明确地具有了指针自身占据地内存时,这个指针表达式就是一个左值,否则就不是一个左值。



综合应用——使用指针进行排序

例题:输入3个不同地整数,存储在变量a、b和c中,使用指针交换,按照从大到小地顺序排序,并输出。
#include <stdio.h>

int main()
{
    int a, b, c;
    int *p1 = &a, *p2 = &b, *p3 = &c, *p;   //声明3个指针变量

    printf("请输入变量a, b, c\n");   //输入a和b的值

    scanf("%d %d %d",&a, &b, &c);

    if(*p1 < *p2)   //当*p1小于*p2时交换
    {
        p = p1;
        p1 = p2;
        p2 = p;
    }

    if(*p1 < *p3)
    {
        p = p1;
        p1 = p3;
        p3 = p;
    }

    if(*p2 < *p3)
    {
        p = p2;
        p2 = p3;
        p3 = p;
    }

    printf("变量a的值是%d, b的值是%d,c的值%d\n", a, b, c);
    printf("变量*p1的值是%d, *p2的值是%d,*p3的值%d\n", *p1, *p2, *p3);

    return 0;
}


例题分析:
计算机内存中的每个内存都由一个地址标识。通常,邻近的内存位置合成一组,这就是允许存储更大范围的值。指针的值表示内存地址。
指针变量的值并非它所指向的存储位置的值。我们必须使用间接访问来获得它所只想位置存储的值。对一个”指向整形的指针“施加间接访问的结果将是一个整型值。
声明一个指针变量并不会自动分配任何内存。在对指针执行间接访问前,指针必须及逆行初始化,或者使它指向现有的内存,或者给它分配动态内存。对未初始化的指针变量执行间接访问操作是非法的,而且这种错误常常难以检测。其结果常常是一个不相关的值被修改。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-1-3 11:21:49 | 显示全部楼层
指针表达式

一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。下面是一些指针表达式的例子。
int a, b;
int array;
int *pa;

pa = &a;    //&a是一个指针表达式
int **ptr = &pa;    //&pa也是指针表达式
*ptr = &b;  //*ptr和&b都是指针表达式

pa = array;
pa++;   //这也是指针表达式

char *arr;
char **parr = arr;    //如果把arr看作指针的话,arr也是指针表达式

char *str;
str = *parr;    //*parr是指针表达式
str = *(parr+1);  //*(parr+1)是表达式
str = *(parr+2);  //*(parr+2)是表达式

由于指针表达式的结果是一个指针,因此指针表达式也具有指针所具有的4个要素,即指针的类型、指针所指向的类型、指针指向的内存区、指针自身占据的内存。  
当一个指针表达式的结果指针已经明确地具有了指针自身占据地内存时,这个指针表达式就是一个左值,否则就不是一个左值。

综合应用――使用指针进行排序

例题:输入3个不同的整数,存储在变量a、b和c中,使用指针交换,按照从大到小的顺序排序,并输出。
#include <stdio.h>

int main() 
{
    int a, b, c;
    int *p1 = &a, *p2 = &b, *p3 = &c, *p;   //声明3个指针变量

    printf("请输入变量a, b, c\n");   //输入a和b的值
    
    scanf("%d %d %d", &a, &b, &c);
    
    if (*p1 < *p2)   //当*p1小于*p2时交换
    {
        p = p1;
        p1 = p2;
        p2 = p;
    }

    if (*p1 < *p3)
    {
        p = p1;
        p1 = p3;
        p3 = p;
    }

    if (*p2 < *p3)
    {
        p = p2;
        p2 = p3;
        p3 = p;
    }

    printf("变量a的值是%d, b的值是%d,c的值是%d\n", a, b, c);
    printf("变量*p1的值是%d, *p2的值是%d,*p3的值是%d\n", *p1, *p2, *p3);

    return 0;
}

例题分析:
计算机内存中的每个内存由一个地址标识。通常,邻近的内存位置合成一组,这就是允许存储更大范围的值。指针的值表示内存地址。  
指针变量的值并非它所指向的存储位置的值。我们必须使用间接访问来获得它所指向位置存储的值。对一个“指向整形的指针”施加间接访问的结果将是一个整型值。
声明一个指针变量并不会自动分配任何内存。在对指针执行间接访问前,指针必须进行初始化,或者使它指向现有的内存,或者给它分配动态内存。对未初始化的指针变量执行间接访问是非法的,而且这种错误常常难以检测,其结果常常是一个不相关的值被修改。


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-23 21:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表