关于指针的十个问题的解答

1. 什么是指针:

指针是一个变量,系统会为指针分配内存空间,指针有自己的地址,并且能够存地址。

2. 指针的算术运算:

(1)指针加减一个整数:

如果一个指针指向的是一个数组,如:

int a[10], *p;

*p = a[5];

那么对p + 1就是加一个数组元素,加的是四个字节,使它指向下一个元素。同理,p - 1是使它指向上一个元素。要注意的是对指针进行加减操作时不要越界,越界可能会导致操作失败。

(2)指针-指针

当两个指针指向的是同一个数组中的元素时才允许进行这种操作;两个指针相减的结果是两个指针之间相差的数组元素个数,即两指针在内存中的距离,此距离以数组元素为单位。

值得注意的是如果两指针指向的不是同一数组,那么它们之间相减的结果是无意义的,同样的两指针相加的结果也是无意义的。

3.指针的关系运算:

对指针执行关系运算也是有限制的,用 < 、> 、>= 、<= 的前提是它们都指向同一数组元素。但是对任何指针都是可以进行相等或不相等的测试,所得的结果是相等或不相等。

4.常量指针与指针常量的区别:

(1)常量指针,如

const char *p;

此语句定义的是一个常量指针,即指向一个常量的指针,指向的内容是常量,不可修改,但指针本身是可以修改的,如 *p = ‘4’;它试图改变指针指向内容的值,而此值是常量不可修改,故此语句是非法的;但 p = &‘4’是可以的,指针可以指向不同的地址。

(2)指针常量,如

char* const p = &a;

这条语句定义的是一个指针常量,即指针本身是常量,不可修改,但指针指向的内容是可以修改的,即 *p = ‘a’,这是可以的,但 p = &b 就是非法的,不可以的。

5.NULL 总是被定义为0吗?

NULL不是被定义为0就是被定义为(void*)0,因为一个纯粹的0和一个void 指针都能被自动的转换成任何所需类型的指针。

6.NULL总是等于0吗?

如果是与比较的结果的话,NULL确实总是等于0,这也是空指针定义的本质所在;但如果指的是其存储方式和整型值的话,答案是不,NULL并不必须被存为一个整型值0。

7.空指针有何用处?

(1)用空指针终止对递归数据结构的间接引用;

(2)用空指针作为进行函数调用失败时的返回值;

(3)用空指针作为标志事物结尾的一个特定值。

8.任何时候都可以用其他指针代替void指针?

是的任何时候都可以用其他类型的指针代替void 指针或用void指针代替其他类型的指针。当进行纯粹内存操作时,或传递一个指向未定类型的指针时,可以使用void指针,void指针也常用作函数指针。

9.函数指针与指针函数的区别:

(1)函数指针:指向这个函数的指针,定义为  数据类型 *fun)(参数列表),如 int (*fun)();

(2)指针函数:返回值是指针的函数,定义为:  数据类型 *fun(参数列表),  如    int *fun().

10.typedef有何妙用?

例如,要定义用法函数指针 int (*fun)(int*, int*),但每次都这样定义会很麻烦,可以用typedef来声明一个新的定义,即函数指针可以如下定义:

typedef int (*FUN)(int*, int*);

FUN fun;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值