数组指针是左值吗?
大佬们,数组指针是左值吗?我百度不到自己实验了一下,发现数组指针自身的地址可以改变,所以数组指针也是左值吗? 不是左值 左值的关键是要能代表一个内存位置以此来赋值等
char (*p);
char p1;
p1和p都是指向数组的指针
都可以当左值
本帖最后由 酱油王 于 2021-7-21 22:59 编辑
万千只cnm 发表于 2021-7-21 17:23
左值的关键是要能代表一个内存位置以此来赋值等
char (*p);
char p1;
我看了鱼小c大哥的视频后,我理解的是数组名就是存放这个数组的首地址的“指针”(我知道数组不是指针,所以打了双引号),指针和数组名的区别就是数组名存放的地址不能改变了,但指针可以,这是我用以下代码得出的结果。
//用的是dev c++ 5.1
//这是数组的
#include <stdio.h>
int main(int argc,char *argv[])
{
char one="qwertyuiop";
one++; /*编译时在这里提醒报错: 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={1,2,3,4,5,6};
one++; //也是在这一行报错提示不是左值
printf("%d",**one);
return 0;
}
然后我又试了数组指针,数组指针存放的地址也可以改变
#include <stdio.h>
int main(void)
{
int one={1,3,5,7,9,11};
int (*a)=one;
a++;
printf("%d",**a); //打印内容为7,也就是说存放的地址往后加了3个int的长度。
return 0;
}
所以我自己总结后感觉二维数组不是左值,数组指针是左值。 酱油王 发表于 2021-7-21 22:18
我看了鱼小c大哥的视频后,我理解的是数组名就是存放这个数组的首地址的“指针”(我知道数组不是指针 ...
那我上面说错了左值应该是能出现在 = 的左边
1
数组名解引用后可以当左值 本身是不能当左值的比如 array = 's'; 但array++ 不行因是为改变了自身
因为数组名代表一个数组的头地址 且本身并没有单独储存空间(指针本身有储存空间,区别之一)也是个指针常量如果能改变数组名的值 整个数组不就找不到了吗
2
操作符也是判断是否可以为左值的 像++ -- 等的结果是个值的拷贝 是右值
必须 * 【】 才能当左值比如“*a++ ” 解引用后才能赋值
运算完为左值的还有 .(访问结构体成员) -> (指针访问成员)
3
char *one="qwertyuiop";
字符串常量的值是个 指针常量 放在静态存储区
是没法改变字符串常量的值。
所以one 解引用也是改变不了的
4
入门以后建议看看 《c与指针》
就会豁然开朗
万千只cnm 发表于 2021-7-22 12:00
那我上面说错了左值应该是能出现在 = 的左边
1
数组名解引用后可以当左值 本身是不能当左值的比如 ...
好的,谢谢
页:
[1]