当前位置:网站首页>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
到这里,指针基本上就介绍完了。我相信最后一个大家肯定会改了。
边栏推荐
- Mysql应用安装后找不到my.ini文件
- MySQL忘记密码怎么办
- Flink sink ES 写入 ES(带密码)
- MySQL optimization: from ten seconds to three hundred milliseconds
- ERROR 2003 (HY000) Can't connect to MySQL server on 'localhost3306' (10061)
- sql语句之多表查询
- sql statement - how to query data in another table based on the data in one table
- SQL row-column conversion
- centos7安装mysql5.7步骤(图解版)
- Temporal介绍
猜你喜欢
随机推荐
质量小议12 -- 以测代评
Multiple table query of sql statement
Linux的mysql报ERROR 1045 (28000) Access denied for user ‘root‘@‘localhost‘ (using password NOYSE)
Temporal线上部署
centos7安装mysql5.7
ABC D - Distinct Trio (Number of k-tuples
Linux系统安装mysql(rpm方式安装)
ERROR 2003 (HY000) Can't connect to MySQL server on 'localhost3306' (10061)
On-line monitoring system for urban waterlogging and water accumulation in bridges and tunnels
MySQL forgot password
pycharm专业版使用
面试官:生成订单30分钟未支付,则自动取消,该怎么实现?
MySQL优化:从十几秒优化到三百毫秒
centos7安装mysql5.7步骤(图解版)
Temporal对比Cadence
Mysql应用安装后找不到my.ini文件
mysql使用on duplicate key update批量更新数据
Goodbye to the cumbersome Excel, mastering data analysis and processing technology depends on it
MySQL事务(transaction) (有这篇就足够了..)
分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ