C语言指针详解

有这么一道题:

用变量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

到这里,指针基本上就介绍完了。我相信最后一个大家肯定会改了。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值