鱼C论坛

 找回密码
 立即注册
查看: 1828|回复: 17

[已解决]指针问题

[复制链接]
发表于 2020-9-3 20:25:40 | 显示全部楼层 |阅读模式

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

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

x

p是个数组名,*p++是先指针后移,变为p数组的第二个元素的地址,然后再取值

所以*p++结果是p数组第二个元素的值,这个说法对不?

最佳答案
2020-9-3 22:09:52
雨天Zz 发表于 2020-9-3 20:36
这个程序我运行了,可以运行

      你这个程序定义了一个指针 p,它指向数组a。p 是指针,而不是数组名。int *p, 变量名叫 p,类型为 int *,可存放一个 int 数据的地址。*p = a,意思是将数组 a 的首地址赋给指针 p ,而不是像你说的,将数组名给了 p 。

      数组和指针不等价,数组是另外一种类型。数组和指针不等价的一个典型案例就是求数组的长度,这个时候只能使用数组名,不能使用数组指针:
#include <stdio.h>
int main()
{
        int a[6] = { 0, 1, 2, 3, 4, 5 };
        int *p = a;
        int len_a = sizeof(a) / sizeof(int);
        int len_p = sizeof(p) / sizeof(int);
        printf("len_a = %d, len_p = %d\n",len_a,len_p);
 
        return 0;
}

//运行结果:len_a = 6, len_p = 1

       数组是一系列数据的集合,没有开始和结束标志,p 仅仅是一个指向 int 类型的指针,编译器不知道它指向的是一个整数还是一堆整数,对 p 使用 sizeof 求得的是指针变量本身的长度。也就是说,编译器并没有把 p 和数组关联起来,p 仅仅是一个指针变量,不管它指向哪里,sizeof 求得的永远是它本身所占用的字节数。那么,数组在什么时候会转换为指针呢?

       (1) 用 a[i] 这样的形式对数组进行访问总是会被编译器改写成(或者说解释为)像 *(a+i) 这样的指针形式。

       (2) 指针始终是指针,它绝不可以改写成数组。你可以用下标形式访问指针,一般都是指针作为函数参数时,而且你知道实际传递给函数的是一个数组。

       (3) 在特定的环境中,当数组作为函数形参时,也只有这种情况,一个数组可以看做是一个指针。作为函数形参的数组始终会被编译器修改成指向数组第一个元素的指针。

       (4) 当希望向函数传递数组时,可以把函数参数定义为数组形式(可以指定长度也可以不指定长度),也可以定义为指针。不管哪种形式,在函数内部都要作为指针变量对待。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-3 20:28:13 From FishC Mobile | 显示全部楼层
数组名不能++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-9-3 20:29:08 | 显示全部楼层

那*p++表示什么,还有数组名可以+1吗,既然它不能++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-3 20:31:00 From FishC Mobile | 显示全部楼层
雨天Zz 发表于 2020-9-3 20:29
那*p++表示什么,还有数组名可以+1吗,既然它不能++

数组名是一个右值,不能被改变,它可以做+1,+1操作并没有改变数组名的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-3 20:33:55 | 显示全部楼层
baige 发表于 2020-9-3 20:31
数组名是一个右值,不能被改变,它可以做+1,+1操作并没有改变数组名的地址

+1就是指针后移啊,确实没改变数组名的地址。是这个意思吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-3 20:34:28 | 显示全部楼层
雨天Zz 发表于 2020-9-3 20:33
+1就是指针后移啊,确实没改变数组名的地址。是这个意思吗

数组名不是指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-3 20:34:59 | 显示全部楼层
baige 发表于 2020-9-3 20:34
数组名不是指针

数组名不是数组第一个元素的指针吗,书上明确写的呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-3 20:35:31 | 显示全部楼层
数组p,*p++是错误的,会直接报错,不能运行,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-3 20:36:33 | 显示全部楼层
baige 发表于 2020-9-3 20:35
数组p,*p++是错误的,会直接报错,不能运行,
#include <stdio.h>
int main()
{
    int i,a[]={1,2,3,4,5,6,7,8,9};
    int *p=a;
    for (i=0;i<9;i++)
    {
        printf("a[%d] 的值是%d\n",i,*p++);
    }
    return 0;
}
这个程序我运行了,可以运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-3 20:38:14 | 显示全部楼层
本帖最后由 baige 于 2020-9-3 21:10 编辑
雨天Zz 发表于 2020-9-3 20:34
数组名不是数组第一个元素的指针吗,书上明确写的呀


数组名可以看成一个指针常量,不能被修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-3 20:39:08 | 显示全部楼层
雨天Zz 发表于 2020-9-3 20:36
这个程序我运行了,可以运行

你是定义一个指针指向数组,和题目的数组名去++不同,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-3 20:41:23 | 显示全部楼层
baige 发表于 2020-9-3 20:38
数组名i可以看成一个指针常量,不能被修改

老师你说的有问题吧,我课本上明显些的指针可以++,可以+1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-3 20:44:25 | 显示全部楼层
雨天Zz 发表于 2020-9-3 20:41
老师你说的有问题吧,我课本上明显些的指针可以++,可以+1

#include <stdio.h>
int main()
{
    int i,a[]={1,2,3,4,5,6,7,8,9};
    for (i=0;i<9;i++)
    {
        printf("a[%d] 的值是%d\n",i,*a++);// 这才是数组名去++,你自己去运行吧
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-3 21:00:08 | 显示全部楼层
baige 发表于 2020-9-3 20:44
#include
int main()
{
#include <stdio.h>
int main()
{
    int i,a[]={1,2,3,4,5,6,7,8,9};
    int *p=a;
    for (i=0;i<9;i++)
    {
        printf("a[%d] 的值是%d\n",i,*p++);
    }
    return 0;
}
这个程序运行的结果是a[0]的值是1,为什么呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-3 21:55:32 | 显示全部楼层
雨天Zz 发表于 2020-9-3 20:41
老师你说的有问题吧,我课本上明显些的指针可以++,可以+1

理解能力有问题?谁跟你说指针不能 ++ 和 +1 了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2020-9-3 22:09:52 | 显示全部楼层    本楼为最佳答案   
雨天Zz 发表于 2020-9-3 20:36
这个程序我运行了,可以运行

      你这个程序定义了一个指针 p,它指向数组a。p 是指针,而不是数组名。int *p, 变量名叫 p,类型为 int *,可存放一个 int 数据的地址。*p = a,意思是将数组 a 的首地址赋给指针 p ,而不是像你说的,将数组名给了 p 。

      数组和指针不等价,数组是另外一种类型。数组和指针不等价的一个典型案例就是求数组的长度,这个时候只能使用数组名,不能使用数组指针:
#include <stdio.h>
int main()
{
        int a[6] = { 0, 1, 2, 3, 4, 5 };
        int *p = a;
        int len_a = sizeof(a) / sizeof(int);
        int len_p = sizeof(p) / sizeof(int);
        printf("len_a = %d, len_p = %d\n",len_a,len_p);
 
        return 0;
}

//运行结果:len_a = 6, len_p = 1

       数组是一系列数据的集合,没有开始和结束标志,p 仅仅是一个指向 int 类型的指针,编译器不知道它指向的是一个整数还是一堆整数,对 p 使用 sizeof 求得的是指针变量本身的长度。也就是说,编译器并没有把 p 和数组关联起来,p 仅仅是一个指针变量,不管它指向哪里,sizeof 求得的永远是它本身所占用的字节数。那么,数组在什么时候会转换为指针呢?

       (1) 用 a[i] 这样的形式对数组进行访问总是会被编译器改写成(或者说解释为)像 *(a+i) 这样的指针形式。

       (2) 指针始终是指针,它绝不可以改写成数组。你可以用下标形式访问指针,一般都是指针作为函数参数时,而且你知道实际传递给函数的是一个数组。

       (3) 在特定的环境中,当数组作为函数形参时,也只有这种情况,一个数组可以看做是一个指针。作为函数形参的数组始终会被编译器修改成指向数组第一个元素的指针。

       (4) 当希望向函数传递数组时,可以把函数参数定义为数组形式(可以指定长度也可以不指定长度),也可以定义为指针。不管哪种形式,在函数内部都要作为指针变量对待。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-3 23:03:05 | 显示全部楼层
风过无痕1989 发表于 2020-9-3 22:09
你这个程序定义了一个指针 p,它指向数组a。p 是指针,而不是数组名。int *p, 变量名叫 p,类型为 ...

请问我这个程序*p++是怎么运算的,不应该根据右结合性吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-4 00:25:29 | 显示全部楼层
雨天Zz 发表于 2020-9-3 23:03
请问我这个程序*p++是怎么运算的,不应该根据右结合性吗?

*p = *p + 1 及 *p += 1 与 *p++ 是等价的。这样说,你能理解了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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