数组名与指针
本帖最后由 jian-qi- 于 2024-1-1 21:14 编辑#include<stdio.h>
int main(void)
{
char str[] = "I Love FishC.com!";
int count = 0;
while (*str++ != '\0')
{
count++;
}
printf("总共有%d个字符!\n",count);
return 0;
}
由于str是常量不可改变,这样是不行的但为什么下面代码中的array可以改变
int array = {
{1, 2, 3},
{4, 5, 6}
};
int (*ptr) = array + 1;
@FishC
嗨,不好意思,可能是我表达不清楚。实际上,数组名可以是左值,也可以是右值,这取决于具体的上下文。
当我们使用数组名作为函数参数传递时(例如函数声明中),数组名会退化为指针,此时数组名就是一个右值。因此,在函数中无法使用`*str++`这样的方式遍历数组元素。
但是,当我们在函数内部定义一个指针指向数组时,指针就是一个左值了(即可进行修改操作)。我们可以使用指针来遍历数组元素,例如:
void printArray(int *ptr, int size) {
for (int i = 0; i < size; i++) {
cout << *ptr++ << " ";
}
}
在这个例子中,`*ptr++`会先取指针指向的元素值,然后将指针向后移动一位,以便指向下一个元素。
所以,对于数组名而言,它既可以是左值,也可以是右值,取决于你怎么使用它。希望我的解释能帮到你!如果还有疑问,请随时追问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 @FishC
jian-qi- 发表于 2024-01-01 18:44
@FishC
哈喽!有问题请尽管来找我,我会尽力帮你解决。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-1-1 18:44
哈喽!有问题请尽管来找我,我会尽力帮你解决。
以上回复来自 FishC AI 小助理,如未能正确解答您的 ...
#include<stdio.h>
int main(void)
{
char str[] = "I Love FishC.com!";
int count = 0;
while (*str++ != '\0')
{
count++;
}
printf("总共有%d个字符!\n",count);
return 0;
}
由于str是左值不可改变,这样是不行的但为什么下面代码中的array可以改变
int array = {
{1, 2, 3},
{4, 5, 6}
};
int (*ptr) = array + 1;
@FishC
jian-qi- 发表于 2024-01-01 18:44
#include
int main(void)
{
char str = "I Lov ...
这是因为数组名作为右值时,会自动转换为指向数组首元素的指针。而在这种情况下,指针是可以改变的。
在你的代码中,`array`是一个二维数组名,表示指向二维数组第一行的指针。当你使用`array + 1`,实际上是得到了指向第二行的指针。然后,将这个指针赋给`ptr`,使`ptr`也指向了第二行。
所以,通过`ptr`指针,你可以修改第二行的元素,比如`ptr = 100;`
但需要注意的是,指针的偏移是根据字节进行的。对于二维数组,如果每行的元素大小不同,那么指针的偏移可能会导致错误的结果。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 本帖最后由 jackz007 于 2024-1-1 20:39 编辑
#include<stdio.h>
int main(void)
{
char str[] = "I Love FishC.com!"; // 这样定义的 str 是常量指针,其值为固定的内存地址,不可以在运行时被改变,也就是说,str 不可以被赋值,而且,只能出现在等号的右边。
int count = 0;
while (* str++ != '\0') // str 是常量,不可以被赋值,str ++ 属于非法操作
{
count++;
}
printf("总共有%d个字符!\n",count);
return 0;
}
建议改成这样:
#include<stdio.h>
int main(void)
{
const char * str = "I Love FishC.com!"; // 这样定义 str 就不会产生问题
int count = 0 ;
while (* str ++ != '\0')
{
count++ ;
}
printf("总共有%d个字符!\n",count) ;
return 0 ;
}
页:
[1]