当前位置:网站首页>C语言指针详解
C语言指针详解
2022-07-31 05:09:00 【怎么这么多名字都被占了】
有这么一道题:
用变量a给出下面的定义:
1、一个指针类型的变量,访问该变量存的地址时,遵循int的访问规则;
2、一个指针类型的变量,访问该变量存的地址时,遵循指针的访问规则。访问那个指针类型的变量时,遵循int的访问规则;
3、一个有10个指针类型变量的数组,访问这些变量存的地址的时候,遵循int的访问规则;
4、一个指针类型的变量,访问该变量存的地址时,遵循(int [10])的访问规则;
5、一个指针类型的变量,访问该变量存的地址时,遵循函数的访问规则,该函数有一个int类型的参数并返回一个int类型的数;
6、一个有10个指针类型变量的数组,访问该变量存的地址时,遵循函数的访问规则,该函数有一个int类型的参数并返回一个int类型的数;
解:
这道题都是关于指针的。那么,什么是指针?
首先,指针不是地址!!!!!!!!!!!!!!!!!!
那么,指针是什么呢?指针其实是一种数据类型,像int char这样的。有些人说了,“定义指针时,不是int *p;吗,类型不是int吗?”其实不然。我们来看看这段代码:
int *p;首先,p是个变量。那么*就是类型,说明p是指针类型的,指针类型变量里存的是地址,并不代表指针就是地址。那么,int是什么?int在这里表示:
访问该指针类型的变量时,遵循int的访问规则,即,访问4字节。
所以,有些人说的所谓“指针指向的变量是啥,指针的‘类型’就是啥”是错漏百出的!!
我们来看这个例子:
int main(void){
short var=0x01;
char *p=&var;
return 0;
}在gcc里,这段代码会出现警告,但警告不是错误,可以正常运行,这也是判断大端小端的方法之一。
回到那些题,我们来给出分析
用变量a给出下面的定义:
1、一个指针类型的变量,访问该变量存的地址时,遵循int的访问规则;
int *a;解析:我们在上面讲过,这里不在赘述。
2、一个指针类型的变量,访问该变量存的地址时,遵循指针的访问规则。访问那个指针类型的变量时,遵循int的访问规则;
int **a;解析:*a是指针类型的变量,访问该变量存的地址时,遵循*(指针)的访问规则。而访问这个指针类型的变量时,遵循int的访问规则。
3、一个有10个指针类型变量的数组,访问这些变量存的地址的时候,遵循int的访问规则;
int *a[10];解析:a是一个数组的名字,这个数组里的变量的类型为*(指针),访问该指针时,遵循int的访问规则(int *)。
4、一个指针类型的变量,访问该变量存的地址时,遵循(int [10])的访问规则;
int (*a)[10];解析:a是一个指针类型的变量,访问该变量里存地址时,遵循(int [10])的访问规则。
常见错误答案:
int *a;
a=&shuzu[0];错因:访问这个指针类型的变量a里存的地址时,遵循int的访问规则,与题目不符。
修改错误答案:
int (*a)[10];
a=shuzu;要时刻记住:数组的名字就是数组的起始地址。所以不需要写&shuzu,直接写shuzu即可
5、一个指针类型的变量,访问该变量存的地址时,遵循函数的访问规则,该函数有一个int类型的参数并返回一个int类型的数;
int (*a)(int);解析:a是一个指针类型的变量,访问该变量存的地址时,遵循int (int)的访问规则,即函数,该函数有一个int类型的参数并返回一个int类型的数
常见错误答案:
int *a;
*a=function(_int);错因:访问这个指针类型的变量a里存的地址时,遵循int的访问规则,与题目不符。
修改错误答案:
int (*a)(int);
a=function;要时刻记住:函数的名字就是函数的起始地址。所以不需要写&function,直接写function即可
6、一个有10个指针类型变量的数组,访问该变量存的地址时,遵循函数的访问规则,该函数有一个int类型的参数并返回一个int类型的数;
第一种方法:
typedef int (*a_t)(int);
a_t a[10];解析:这种方法分步做。typedef给数据类型起别名。起别名时,先写typedef,在像定义变量一样起别名,“变量名”就是该数据类型的别名。
第二种方法:
int (*a[10])(int);这种方法就是把第一种方法合成一步。
第三种方法:
typedef int (*a_t)(int);a_t a[10];解析:这种方法看上去只有一步,实则有两步,就是第一种方法的变种。
常见错误答案:
int *a[10];
a=&function(_int);要是靠这段代码去面试,面试官都有喊声“带聪明”
错因:首先,a是一个数组的名字,这个数组里的变量的类型为*(指针),访问该指针时,遵循int的访问规则(int *)与题目不符。其次,&function(_int)是取该函数返回值的地址,但该函数的返回值已经“死”了。
编译报错:
In function 'main':
[Error] lvalue required as unary '&' operand到这里,指针基本上就介绍完了。我相信最后一个大家肯定会改了。
边栏推荐
- 关于superset集成到自己的项目中
- SQL statement to range query time field
- MySQL-Explain详解
- Sun Wenlong, Secretary General of the Open Atom Open Source Foundation |
- With MVC, why DDD?
- wx.miniProgram.navigateTo在web-view中跳回小程序并传参
- MySQL事务(transaction) (有这篇就足够了..)
- MySQL database installation (detailed)
- Anaconda配置环境指令
- Three oj questions on leetcode
猜你喜欢

sql statement - how to query data in another table based on the data in one table

mysql使用on duplicate key update批量更新数据

Interviewer, don't ask me to shake hands three times and wave four times again

On-line monitoring system for urban waterlogging and water accumulation in bridges and tunnels

MYSQL一站式学习,看完即学完

centos7安装mysql5.7步骤(图解版)

MySQL8.0安装教程,在Linux环境安装MySQL8.0教程,最新教程 超详细

EasyExcel的简单读取操作

Temporal客户端模型

Information System Project Manager Core Test Site (55) Configuration Manager (CMO) Work
随机推荐
Centos7 install mysql5.7 steps (graphical version)
Distributed transaction processing solution big PK!
面试官:生成订单30分钟未支付,则自动取消,该怎么实现?
<urlopen error [Errno 11001] getaddrinfo failed>的解决、isinstance()函数初略介绍
EasyExcel的简单读取操作
SQL statement to range query time field
MySQL8--Windows下使用压缩包安装的方法
Three oj questions on leetcode
MySQL忘记密码怎么办
【MySQL8入门到精通】基础篇- Linux系统静默安装MySQL,跨版本升级
【一起学Rust】Rust学习前准备——注释和格式化输出
ERP Production Operation Control Kingdee
12个MySQL慢查询的原因分析
Minio上传文件ssl证书不受信任
Workflow番外篇
数据集划分以及交叉验证法
ABC D - Distinct Trio (Number of k-tuples
MySQL常见面试题汇总(建议收藏!!!)
CentOS7 安装MySQL 图文详细教程
Temporal介绍