鱼C论坛

 找回密码
 立即注册
查看: 415|回复: 6

[已解决]数组名与指针

[复制链接]
发表于 2024-1-1 18:29:28 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 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[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

int (*ptr)[3] = array + 1;
@FishC
最佳答案
2024-1-1 19:15:02
本帖最后由 jackz007 于 2024-1-1 20:39 编辑
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.     char str[] = "I Love FishC.com!"; // 这样定义的 str 是常量指针,其值为固定的内存地址,不可以在运行时被改变,也就是说,str 不可以被赋值,而且,只能出现在等号的右边。
  5.     int count = 0;
  6.     while (* str++ != '\0')           // str 是常量,不可以被赋值,str ++ 属于非法操作
  7.     {
  8.         count++;
  9.     }
  10.     printf("总共有%d个字符!\n",count);
  11.     return 0;
  12. }
复制代码

    建议改成这样:
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.     const char * str = "I Love FishC.com!"  ; // 这样定义 str 就不会产生问题
  5.     int count = 0                           ;
  6.     while (* str ++ != '\0')
  7.     {
  8.         count++                             ;
  9.     }
  10.     printf("总共有%d个字符!\n",count)       ;
  11.     return 0                                ;
  12. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-1 18:29:38 | 显示全部楼层
嗨,不好意思,可能是我表达不清楚。实际上,数组名可以是左值,也可以是右值,这取决于具体的上下文。

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

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

  1. void printArray(int *ptr, int size) {
  2.     for (int i = 0; i < size; i++) {
  3.         cout << *ptr++ << " ";
  4.     }
  5. }
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-1 18:44:20 | 显示全部楼层
@FishC
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-1 18:44:31 | 显示全部楼层


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

int (*ptr)[3] = array + 1;
@FishC
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0][0] = 100;`

但需要注意的是,指针的偏移是根据字节进行的。对于二维数组,如果每行的元素大小不同,那么指针的偏移可能会导致错误的结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-1 19:15:02 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-1-1 20:39 编辑
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.     char str[] = "I Love FishC.com!"; // 这样定义的 str 是常量指针,其值为固定的内存地址,不可以在运行时被改变,也就是说,str 不可以被赋值,而且,只能出现在等号的右边。
  5.     int count = 0;
  6.     while (* str++ != '\0')           // str 是常量,不可以被赋值,str ++ 属于非法操作
  7.     {
  8.         count++;
  9.     }
  10.     printf("总共有%d个字符!\n",count);
  11.     return 0;
  12. }
复制代码

    建议改成这样:
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.     const char * str = "I Love FishC.com!"  ; // 这样定义 str 就不会产生问题
  5.     int count = 0                           ;
  6.     while (* str ++ != '\0')
  7.     {
  8.         count++                             ;
  9.     }
  10.     printf("总共有%d个字符!\n",count)       ;
  11.     return 0                                ;
  12. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 08:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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