int**P是否与int*(*P)等价举例说明
时间: 2024-08-15 16:02:15 浏览: 92
`int** P` 和 `int* (*P)` 在 C 或 C++ 中代表的是两种不同的数据类型。
`int** P` 定义了一个指向指针的指针,即一个可以存储 `int` 类型指针地址的变量。你可以将它想象成一个盒子,这个盒子能装下另一个盒子,里面装的是 `int` 的地址。例如:
```c++
int a = 5;
int* p = &a; // p 指向 a 的地址
int** pp = &p; // pp 现在是一个指向 p 的指针,也就是 a 的地址
```
而 `int* (*P)` 则是一个函数指针,它接收一个 `int` 类型的指针作为参数,并返回一个同样类型的指针。简单地说,这是用来操作指针的函数的一个引用。比如:
```c++
void setPtr(int* p) {
P = &p; // 这里 P 是一个函数指针,它保存的是 setPtr 函数的返回值
}
void main() {
int b = 7;
int* q = &b;
setPtr(q); // P 现在指向的是 q
}
```
总结来说,两者的主要区别在于一个是存储其他指针的容器,另一个是处理指针的引用。在实际使用中,它们的应用场景和作用完全不同。
相关问题
C语言中(*p).name=1写法正确吗,=前面要加括号吗,不对怎么修改,举例
### 回答1:
对的,这个写法是正确的,(*p).name=1和p->name=1是等价的。其中,(*p)是对指针p所指向的结构体的解引用,然后通过点运算符"."来访问结构体中的成员变量name。
如果要修改的话,可以使用括号将*p括起来,如((*p).name)=1。这样做是为了确保"."运算符优先级高于"*"运算符,从而避免出现语法错误。
举例来说,如果有一个结构体类型为Person,其中包含成员变量name和age,可以定义一个指向Person类型的指针p,然后通过(*p).name或p->name来访问name成员变量,如下所示:
```
typedef struct {
char name[20];
int age;
} Person;
Person person = {"Tom", 18};
Person *p = &person;
(*p).name = "John"; // 修改name成员变量为"John"
p->age = 20; // 修改age成员变量为20
```
### 回答2:
C语言中(*p).name=1写法是正确的,但是可以更好地使用括号来提高可读性,即(*p).name = 1。
这种写法主要用于操作指针指向的结构体成员。例如,若定义了如下结构体:
```c
struct Person {
int age;
char name[20];
};
```
然后声明一个指向该结构体的指针p:
```c
struct Person *p;
```
我们可以通过(*p).name = 1来修改p所指向的结构体中的name成员的值为1。但是可以使用更简洁的箭头运算符->来完成相同的操作,即p->name = 1。
下面是使用箭头运算符修改name成员的示例:
```c
#include <stdio.h>
struct Person {
int age;
char name[20];
};
int main() {
struct Person obj;
struct Person *p = &obj;
p->name = 1; // 错误写法
printf("%s\n", p->name);
return 0;
}
```
上述示例中,我们尝试将name成员的值修改为1,但是这是错误的,因为name是一个字符数组,无法直接将整数值1赋给它。正确的做法是将其修改为一个字符串,如`p->name = "John"`。
所以,根据结构体成员的类型,我们需要适当修改上述代码,以确保正确赋值。
### 回答3:
C语言中,(*p).name=1写法是正确的。在这个写法中,p是一个指针,(*p)表示解引用指针p得到指向的结构体,然后使用点操作符(.)来访问结构体中的成员name,并将其赋值为1。
在这个写法中,=前面不需要加括号。这是因为点操作符(.)的优先级比赋值操作符(=)更高,所以不需要用括号来改变优先级。
举个例子来说明这个写法的使用:
```c
#include <stdio.h>
struct Person {
int age;
char name[20];
};
int main() {
struct Person person;
struct Person* p = &person;
(*p).age = 30;
(*p).name[0] = 'J';
(*p).name[1] = 'o';
(*p).name[2] = 'h';
(*p).name[3] = 'n';
(*p).name[4] = '\0';
printf("Age: %d\n", (*p).age);
printf("Name: %s\n", (*p).name);
return 0;
}
```
在这个例子中,我们定义了一个名为Person的结构体,它有一个int类型的age成员和一个char类型的name成员。
我们创建了一个名为person的结构体变量,并将其地址赋值给指针p。
然后,我们使用(*p).name来访问结构体中的name成员,并将其赋值为'J'、'o'、'h'、'n'和'\0'。
最后,我们使用printf函数来打印出结构体中的age和name成员的值。
这个例子展示了(*p).name=1写法的正确使用。
阅读全文