xinkuzix 发表于 2024-8-24 11:20

请教个c语言小问题


intarray;
int(*ptr);
ptr=&array   //这行写成 ptr=array 行不行?为什么?

无闻无问 发表于 2024-8-24 11:37

不行,一个是行指针,一个是列指针……

doctrinist 发表于 2024-8-24 11:42

ptr=array;

W-沃尔 发表于 2024-8-24 11:46

ptr=array这个意思是array里面的第一个地址,但是实际上里面有十个,类型不匹配

以爱之名 发表于 2024-8-24 11:46

不行。这两行代码的含义是不同的。

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

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

    ```cpp
    int array;
    int (*ptr);
    ptr = &array;
    ```

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

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

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

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

### 详细解释:

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

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

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

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

### 总结:

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

因此,代码中 `ptr = &array` 是正确的,而 `ptr = array` 会导致类型不匹配的错误。

xinkuzix 发表于 2024-8-24 11:54

以爱之名 发表于 2024-8-24 11:46
不行。这两行代码的含义是不同的。

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


明白了,谢谢!{:1_921:}

以爱之名 发表于 2024-8-24 11:55

xinkuzix 发表于 2024-8-24 11:54
明白了,谢谢!

哈哈哈可以找个AI当老师,这些ai都可以完美解答

anyongfu 发表于 2024-8-24 12:49

因为ptr是个指针,需要取到地址在赋值...

djdgf4 发表于 2024-8-24 15:27

补充一下
Mingw gcc


x86-64 clang


都只是警告但在x64gcc上,可以看到直接是编译阶段错误至于信息,可以看到是类型不匹配,楼上已经有了详细解释这里是clang给的警告
<source>:7:7: warning: incompatible pointer types assigning to 'int *' from 'int (*)' [-Wincompatible-pointer-types]
    7 |   p = &array;
      |       ^ ~~~~~~
<source>:9:9: warning: incompatible pointer types assigning to 'int (*)' from 'int'; take the address with & [-Wincompatible-pointer-types]
    9 |   ptr = array;
      |       ^ ~~~~~
      |           &
2 warnings generated.
Compiler returned: 0

xinkuzix 发表于 2024-8-24 19:30

以爱之名 发表于 2024-8-24 11:55
哈哈哈可以找个AI当老师,这些ai都可以完美解答

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

麻烦老师看下面这个问题,第三行是写错了吗?如果对是什么意思?实在看不懂{:1_893:}
toupper( int c ){
    if (c >='a' && c <='z')
      c += 'A' ? 'a';
    return c;
}
页: [1] 2 3
查看完整版本: 请教个c语言小问题