第5章数组与指针十个问题

本文讨论了C语言中数组与指针的相关问题,包括:指针与函数的关系,函数指针的优势,不完整类型的用途,字符串与字符数组的区别,野指针与空指针的差异,无类型指针的概念,右左法则的应用,指针类型的理解,C++与C指针的区别,以及空指针与0、NULL的联系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. *int *&p =(int) function这是什么?

&p是求指针变量p本身的地址,这是一个32位的二进制常数。(int *)&p表示将地址强制转换为指向int类型数据的指针。(int)function表示将函数的入口地址强制转换成int类型的数据。*(int *)&p=(int)function;表示将函数的入口地址赋值给指针变量p

 

2. 使用函数指针有什么优点?

   使用函数指针的好处在于,可以将实现同一功能的多个模块统一起来标识,这样一来后期的维护,更容易,系统结构更加清晰。换句话说,便于分层设计,利于系统抽象,降低耦合度以及使接口与实现分开

 

3. 不完整类型有什么作用?

   可以这么说,C的不完整类型是提供给C实现封装抽象的唯一工具。

 

4. 字符串和数组有什么不同?

   字符串指针变量本身就是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以\0作为串的结束。字符数组是由若干个数组元素组成的,它可用来存放整个字符串。

   对字符串指针方式,char *ps=C Language;

   可以写成char *ps;ps=C Language;

   而对于数组方式,char st[]={C Language}

     不能写成char st[20];

          St={C Language};

只能对字符数组的各元素逐个赋值

 

5. 野指针与空指针有什么区别?

   空指针是个特殊的指针值,也是唯一一个对任何指针类型都合法得指针值

   野指针,也就是指向不可用区域的指针,通常对这种指针进行操作的话,将会使程序发生不可预知的错误。

   或者说,野指针是用free释放后的指针,要复制NULL才能避免野指针的出现,而空指针就是指向NULL

 

6. 无类型指针和空指针有什么区别?

空指针是一种特殊的指针,表示当前这个指针变量处于空闲状态,没有指向任何有意义的内存空间。C++NULL来表示空指针,NULL是一个符号常量值为0;   

无类型指针指的是void *这种指针,表示可以指向任何数据类型,比如

Int n=3;

Int *p=NULL;

Void *gp=&n;

P=(int *)gp;

Printf(%d\n,*p);

结果输出3,说明无类型指针可以转换成任何数据类型的指针。

 

7. 右左法则是通用的吗?

   右左法则是一个既著名又常用的方法,不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辨识一个声明的,两者可以说是相反的。

 

8. 指针本身类型有什么区别?

     指针是没什么类型区分的,但是指针指向的内存存储的数据就有类型,指针的类型就是指向内存数据的类型。不告诉系统指向的是什么类型,系统就不知道该取多少连续内存作为一个数据

 

9. C++指针和C指针有什么区别?

   前者类型要求更严格。

先看看在C语言中,test.c 如下

int main()

{

int *p;

char *q;

void *v;

v=p;

q=v;

return 0;

}

程序OK,但程序的风格本身就不好,而且不便于移植到C++

C++语言中,test.cpp如下

int main()

{

int *p;

char *q;

void *v;

v=p;

q=v;

return 0;

}

编译时会出错。C++更严格,更好。

 

10.  空指针和0NULL有什么关系?

   C++系统,由于存在严格的类型转换的要求,void *不能像C中那样自由转换为其它类型,所以通常选择0作为空指针常量,而不选择(void *)0

  如果p是一个指针变量,则p=0;p=(void *)0;p都成为一个空指针。由系统保证空指针不指向任何实际的对象或者函数

  NULL是一个标准规定的宏定义,用来表示空指针常量,除了上面的赋值方式以外,还可以用p=NULL;来使p成为一个空指针。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值