jian-qi- 发表于 2024-1-1 18:29:28

数组名与指针

本帖最后由 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

FishC 发表于 2024-1-1 18:29:38

嗨,不好意思,可能是我表达不清楚。实际上,数组名可以是左值,也可以是右值,这取决于具体的上下文。

当我们使用数组名作为函数参数传递时(例如函数声明中),数组名会退化为指针,此时数组名就是一个右值。因此,在函数中无法使用`*str++`这样的方式遍历数组元素。

但是,当我们在函数内部定义一个指针指向数组时,指针就是一个左值了(即可进行修改操作)。我们可以使用指针来遍历数组元素,例如:

void printArray(int *ptr, int size) {
    for (int i = 0; i < size; i++) {
      cout << *ptr++ << " ";
    }
}

在这个例子中,`*ptr++`会先取指针指向的元素值,然后将指针向后移动一位,以便指向下一个元素。

所以,对于数组名而言,它既可以是左值,也可以是右值,取决于你怎么使用它。希望我的解释能帮到你!如果还有疑问,请随时追问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jian-qi- 发表于 2024-1-1 18:44:20

@FishC

FishC 发表于 2024-1-1 18:44:31

jian-qi- 发表于 2024-01-01 18:44
@FishC

哈喽!有问题请尽管来找我,我会尽力帮你解决。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jian-qi- 发表于 2024-1-1 18:44:51

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

FishC 发表于 2024-1-1 18:45:09

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 19:15:02

本帖最后由 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]
查看完整版本: 数组名与指针