鱼C论坛

 找回密码
 立即注册
查看: 1332|回复: 5

[已解决]数组指针是左值吗?

[复制链接]
发表于 2021-7-21 16:11:16 | 显示全部楼层 |阅读模式

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

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

x
大佬们,数组指针是左值吗?
我百度不到自己实验了一下,发现数组指针自身的地址可以改变,所以数组指针也是左值吗?
最佳答案
2021-7-22 12:00:37
酱油王 发表于 2021-7-21 22:18
我看了鱼小c大哥的视频后,我理解的是数组名就是存放这个数组的首地址的“指针”(我知道数组不是指针 ...

那我上面说错了  左值应该是能出现在 = 的左边
1
数组名解引用后可以当左值 本身是不能当左值的  比如 array[0] = 's'; 但array++ 不行因是为改变了自身
因为数组名代表一个数组的头地址 且本身并没有单独储存空间(指针本身有储存空间,区别之一)也是个指针常量  如果能改变数组名的值 整个数组不就找不到了吗

2
操作符  也是判断是否可以为左值的 像++ -- 等的结果是个值的拷贝 是右值
必须 * 【】 才能当左值  比如  “*a++ ”   解引用后才能赋值
运算完为左值的还有 .(访问结构体成员)        -> (指针访问成员)

3
char *one="qwertyuiop";
字符串常量的值是个 指针常量 放在静态存储区  
是没法改变字符串常量的值。
所以one 解引用也是改变不了的

4
入门以后建议看看 《c与指针》
就会豁然开朗

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

使用道具 举报

发表于 2021-7-21 16:19:51 | 显示全部楼层
不是左值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-21 17:23:50 | 显示全部楼层
左值的关键是要能代表一个内存位置  以此来赋值等
char (*p)[3];
char p1[1][3];
p1和p都是指向数组的指针

都可以当左值

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

使用道具 举报

 楼主| 发表于 2021-7-21 22:18:23 | 显示全部楼层
本帖最后由 酱油王 于 2021-7-21 22:59 编辑
万千只cnm 发表于 2021-7-21 17:23
左值的关键是要能代表一个内存位置  以此来赋值等
char (*p)[3];
char p1[1][3];


我看了鱼小c大哥的视频后,我理解的是数组名就是存放这个数组的首地址的“指针”(我知道数组不是指针,所以打了双引号),指针和数组名的区别就是数组名存放的地址不能改变了,但指针可以,这是我用以下代码得出的结果。
//用的是dev c++ 5.1
//这是数组的

#include <stdio.h>

int main(int argc,char *argv[])
{
        char one[10]="qwertyuiop";
       
        one++;                     /*编译时在这里提醒报错:[Error] lvalue required as increment operand
                                          所以我以此来判断数组不是一个左值,因为数组名里存放的地址不能改变;
       
        printf("%c",one);      
          
        return 0;
}
但是指针时就可以,这是指针的

#include <stdio.h>

int main(int argc,char *argv[])
{
        char *one="qwertyuiop";
       
        one++;
       
        printf("%c",*one);    //打印的值为'w',也就是说指针里存放的地址往后加了一个字节。
          
        return 0;
}
然后我又试了二维数组,同样提示我这个数组名不是一个左值。
#include <stdio.h>

int main(void)
{
        int one[2][3]={1,2,3,4,5,6};
       
        one++;                         //也是在这一行报错提示不是左值
       
        printf("%d",**one);   
   
        return 0;
}
然后我又试了数组指针,数组指针存放的地址也可以改变
#include <stdio.h>

int main(void)
{
        int one[2][3]={1,3,5,7,9,11};
        int (*a)[3]=one;
       
        a++;
       
        printf("%d",**a);   //打印内容为7,也就是说存放的地址往后加了3个int的长度。
   
        return 0;
}

所以我自己总结后感觉二维数组不是左值,数组指针是左值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-22 12:00:37 | 显示全部楼层    本楼为最佳答案   
酱油王 发表于 2021-7-21 22:18
我看了鱼小c大哥的视频后,我理解的是数组名就是存放这个数组的首地址的“指针”(我知道数组不是指针 ...

那我上面说错了  左值应该是能出现在 = 的左边
1
数组名解引用后可以当左值 本身是不能当左值的  比如 array[0] = 's'; 但array++ 不行因是为改变了自身
因为数组名代表一个数组的头地址 且本身并没有单独储存空间(指针本身有储存空间,区别之一)也是个指针常量  如果能改变数组名的值 整个数组不就找不到了吗

2
操作符  也是判断是否可以为左值的 像++ -- 等的结果是个值的拷贝 是右值
必须 * 【】 才能当左值  比如  “*a++ ”   解引用后才能赋值
运算完为左值的还有 .(访问结构体成员)        -> (指针访问成员)

3
char *one="qwertyuiop";
字符串常量的值是个 指针常量 放在静态存储区  
是没法改变字符串常量的值。
所以one 解引用也是改变不了的

4
入门以后建议看看 《c与指针》
就会豁然开朗

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

使用道具 举报

 楼主| 发表于 2021-7-22 13:51:44 | 显示全部楼层
万千只cnm 发表于 2021-7-22 12:00
那我上面说错了  左值应该是能出现在 = 的左边
1
数组名解引用后可以当左值 本身是不能当左值的  比如 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 18:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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