当前位置:网站首页>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到这里,指针基本上就介绍完了。我相信最后一个大家肯定会改了。
边栏推荐
- a different object with the same identifier value was already associated with the session
- 1. 获取数据-requests.get()
- matlab abel变换图片处理
- 1. Get data - requests.get()
- CentOS7 - yum install mysql
- Mysql——字符串函数
- [Cloud Native] DevOps (5): Integrating Harbor
- Interviewer, don't ask me to shake hands three times and wave four times again
- 关于小白安装nodejs遇到的问题(npm WARN config global `--global`, `--local` are deprecated. Use `--location=glob)
- Flink sink ES 写入 ES(带密码)
猜你喜欢

Distributed Transactions - Introduction to Distributed Transactions, Distributed Transaction Framework Seata (AT Mode, Tcc Mode, Tcc Vs AT), Distributed Transactions - MQ

MySQL (updating)

CentOS7 install MySQL graphic detailed tutorial

centos7安装mysql5.7

pycharm专业版使用

DVWA shooting range environment construction

Interviewer: If the order is not paid within 30 minutes, it will be automatically canceled. How to do this?

DVWA installation tutorial (understand what you don't understand · in detail)

Minesweeper game (written in c language)

12个MySQL慢查询的原因分析
随机推荐
mysql stored procedure
MySQL常见面试题汇总(建议收藏!!!)
Minesweeper game (written in c language)
[Introduction to MySQL 8 to Mastery] Basics - silent installation of MySQL on Linux system, cross-version upgrade
sql statement - how to query data in another table based on the data in one table
Lock wait timeout exceeded解决方案
MySQL (updating)
MYSQL下载及安装完整教程
MySQL(更新中)
Apache DButils使用注意事项--with modifiers “public“
限流的原理
Interview Redis High Reliability | Master-Slave Mode, Sentinel Mode, Cluster Cluster Mode
Sun Wenlong, Secretary General of the Open Atom Open Source Foundation |
DVWA安装教程(懂你的不懂·详细)
矩池云快速安装torch-sparse、torch-geometric等包
可点击也可直接复制指定内容js
.NET-9. A mess of theoretical notes (concepts, ideas)
分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ
pycharm专业版使用
Mysql应用安装后找不到my.ini文件