吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 835|回复: 28
收起左侧

[已解决] 请教个c语言小问题

[复制链接]
xinkuzix 发表于 2024-8-24 11:20
int  array[10];
int  (*ptr)[10];
ptr=&array     //这行写成 ptr=array 行不行?为什么?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

无闻无问 发表于 2024-8-24 11:37
不行,一个是行指针,一个是列指针……
doctrinist 发表于 2024-8-24 11:42
W-沃尔 发表于 2024-8-24 11:46
ptr=array这个意思是array里面的第一个地址,但是实际上里面有十个,类型不匹配
以爱之名 发表于 2024-8-24 11:46
不行。这两行代码的含义是不同的。

### 理解 `ptr = &array` 和 `ptr = array` 的区别:

1. **`ptr = &array`:**

    ```cpp
    int array[10];
    int (*ptr)[10];
    ptr = &array;
    ```

    - `array` 是一个包含 10 个 `int` 的数组。
    - `ptr` 是一个指向包含 10 个 `int` 的数组的指针。
    - `&array` 是 `array` 的地址,这个地址的类型是 `int (*)[10]`,与 `ptr` 的类型匹配。
    - 因此,`ptr = &array` 是合法的,`ptr` 将指向这个数组。

2. **`ptr = array`:**

    ```cpp
    int array[10];
    int (*ptr)[10];
    ptr = array;  // 错误!
    ```

    - `array` 是一个包含 10 个 `int` 的数组。
    - `array` 作为一个数组名,在表达式中会被隐式转换为指向它的第一个元素的指针,类型为 `int *`。
    - `ptr` 是一个指向包含 10 个 `int` 的数组的指针,类型为 `int (*)[10]`。
    - `int *` 和 `int (*)[10]` 是不同的类型,因此 `ptr = array` 会导致类型不匹配的错误。

### 详细解释:

- **数组和指针的区别:**

  - 数组名 `array` 在大多数表达式中会衰减为一个指向数组第一个元素的指针,这个指针的类型是 `int *`。
  - `&array` 是数组的地址,其类型与数组名不同,`&array` 的类型是 `int (*)[10]`。它指向整个数组。

- **指针声明和赋值:**

  - `int (*ptr)[10]` 声明了一个指针,该指针指向一个包含 10 个 `int` 的数组。这个指针可以存储一个数组的地址。
  - `ptr = &array` 是合法的,因为 `&array` 的类型是 `int (*)[10]`,与 `ptr` 的类型相同。
  - `ptr = array` 是非法的,因为 `array` 被转换为 `int *`,这与 `ptr` 的类型 `int (*)[10]` 不匹配。

### 总结:

- `ptr = &array` 是正确的,因为 `ptr` 是一个指向包含 10 个 `int` 的数组的指针,而 `&array` 的类型正是 `int (*)[10]`。
- `ptr = array` 是错误的,因为 `array` 会被转换为 `int *`,这与 `ptr` 的类型不匹配。

因此,代码中 `ptr = &array` 是正确的,而 `ptr = array` 会导致类型不匹配的错误。
 楼主| xinkuzix 发表于 2024-8-24 11:54
以爱之名 发表于 2024-8-24 11:46
不行。这两行代码的含义是不同的。

### 理解 `ptr = &array` 和 `ptr = array` 的区别:

明白了,谢谢!
以爱之名 发表于 2024-8-24 11:55

哈哈哈可以找个AI当老师,这些ai都可以完美解答
anyongfu 发表于 2024-8-24 12:49
因为ptr是个指针,需要取到地址在赋值...
djdgf4 发表于 2024-8-24 15:27
补充一下
Mingw gcc

image.png
x86-64 clang

image.png
都只是警告但在x64gcc上,可以看到直接是编译阶段错误 image.png 至于信息,可以看到是类型不匹配,楼上已经有了详细解释这里是clang给的警告
<source>:7:7: warning: incompatible pointer types assigning to 'int *' from 'int (*)[10]' [-Wincompatible-pointer-types]
    7 |     p = &array;
      | [color=var(--terminal-green)]      ^ ~~~~~~
<source>:9:9: warning: incompatible pointer types assigning to 'int (*)[10]' from 'int[10]'; take the address with & [-Wincompatible-pointer-types]
    9 |     ptr = array;
      | [color=var(--terminal-green)]        ^ ~~~~~
      | [color=var(--terminal-green)]          &
2 warnings generated.
Compiler returned: 0
 楼主| xinkuzix 发表于 2024-8-24 19:30
以爱之名 发表于 2024-8-24 11:55
哈哈哈可以找个AI当老师,这些ai都可以完美解答

有免费的AI倒是可以弄一个,可惜我的水平搞不到。

麻烦老师看下面这个问题,第三行是写错了吗?如果对是什么意思?实在看不懂
toupper( int c ){
    if (c >='a' && c <='z')
        c += 'A' ? 'a';
    return c;
}
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 07:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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