指针类型表达式

本文详细探讨了指针、数组指针、函数指针的基础概念,包括指针类型、数组指针的定义,以及函数指针数组和指向函数指针数组的指针实例。通过实例演示,揭示了它们在编程中的实际操作和作用。

int* p; 指向整形的指针变量p p是指针变量,int*是指针类型

char* str;指向字符的指针变量,也是字符串的表达形式

float* p和double* p 这些都是比较简单的指针

指针数组和数组指针:

指针数组: 是一个数组->存放指针的数组

int a = 1;

int b = 2;

int c = 3;

int* arr[3] = {&a,&b,&c};

数组指针:是一个指针,指针指向一个数组的地址

int arr[3] = {1,2,3};

int (*parr)[3] = &arr; *parr 必须用括号括起来,保证parr先是指针,不然就是数组了.这个表达式表 示parr指针,指向一个元素个数为3的整形数组

函数指针:是一个指针,指针指向一个函数

int add(int x, int y)

{ return x + y;

}

int (*p)(int, int) = &add; 这里p = add

函数指针数组:

int add(int x, int y)

{ return x + y;

}

int sub(int x, int y)

{ return x - y;

}

int mul(int x, int y)

{ return x * y;

}

int div(int x, int y)

{ return x / y;

}

int (*p[4])(int, int) = {&add,&sub,&mul,&div}

指向函数指针数组的指针:

接着上面的代码:

int (*p[4])(int, int) = {&add,&sub,&mul,&div}   p是函数指针数组

int (*(*p2)[4])(int, int) = &p;      这里p2就是指向函数指针数组的指针了

### 关于“表达式必须包含指针类型”的错误原因及解决方案 在 C/C++ 编程中,当出现“表达式必须包含指针类型”这样的编译错误时,通常是因为代码中尝试对一个非指针类型的变量执行了需要指针类型的操作。以下是对该问题的详细分析和解决方法: #### 错误原因 1. **操作符与数据类型不匹配** 某些操作符(如解引用操作符 `*` 或地址操作符 `&`)只能用于指针类型或需要指针类型的上下文中。如果这些操作符被应用于非指针类型的变量,则会导致编译错误[^3]。 2. **函数参数类型不匹配** 如果调用的函数期望传递指针类型的参数,但实际传递的是非指针类型的数据,则会触发此错误。例如,C 标准库中的 `strcpy` 函数要求第一个参数为字符数组的指针类型 `char*`,如果传递了一个非指针类型的数据,则会出现错误[^1]。 3. **数组名作为指针使用时的误解** 在某些情况下,数组名可以被视为指向其第一个元素的指针,但如果数组名被错误地用作非指针类型的操作,则可能引发此错误[^3]。 #### 解决方案 1. **确保正确使用指针类型** 如果需要对指针进行操作,请确保变量确实是一个指针类型。例如: ```cpp int a = 10; int* ptr = &a; // 正确:ptr 是一个指向 int 类型指针 cout << *ptr; // 正确:解引用指针以获取值 ``` 2. **检查函数参数类型** 确保传递给函数的参数类型与函数定义一致。例如,对于 `strcpy` 函数: ```cpp char str1[50], str2[50]; strcpy(str1, "Hello"); // 正确:str1 是 char* 类型 strcpy(str2, str1); // 正确:str2 和 str1 都是 char* 类型 ``` 3. **明确区分数组与指针** 数组名在某些上下文中可以隐式转换为指针,但在其他情况下需要显式处理。例如: ```cpp int arr[5] = {1, 2, 3, 4, 5}; int* ptr = arr; // 正确:arr 被视为指向第一个元素的指针 cout << *(ptr + 2); // 正确:访问数组第三个元素 ``` 4. **使用智能指针避免常见错误** 在现代 C++ 中,推荐使用智能指针(如 `std::unique_ptr` 或 `std::shared_ptr`)来管理动态内存,从而减少因指针操作不当导致的错误[^2]。 #### 示例代码 以下是一个可能导致“表达式必须包含指针类型”错误的示例及其修复方法: ```cpp // 错误代码 int a = 10; cout << *a; // 错误:a 不是指针类型,不能对其解引用 // 修复后的代码 int a = 10; int* ptr = &a; // 定义一个指向 int 的指针 cout << *ptr; // 正确:解引用指针以获取值 ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值