指针数组

1.int 指针 float和零值如何比较
int 型变量n与零值的比较:
if(n == 0)
if(n != 0)
char p与零值的比较:
if(p == NULL)
if(p != NULL)
float 型变量x与零值的比较:
if(x == 0.0) if(x != 0.0)都是错误的比较
正确比较为:
const flaot EPSINON = 0.00001;
if(x>=-EPSINON)&&(x<=EPSINON) 其中EPSINON是允许的误差(即精度)
3.const define的区别?
#define Pi 3.1415926 //定义符号常量
const float pi = 301415926 //定义常变量
const:它是一个常变量具有变量的基本属性:有类型,编译运行时会进行类型检查;存在于数据段,堆栈,占存储单元只是不允许改变其值;编译运行阶段使用,有实际的存在并可被调用,传递。
define:只是用作文本替换;对符号常量的名字是不分配存储单元的;在预处理阶段后,符号常量就不存在了(全置换成3.1415926),存在于代码段;只是一个常数,一个命令中的参数,并没有实际的存在;无数据类型。
define注意”边缘效应”:
例:#define N 2+3 //N的值是5
int a = N/2 //在编译时预想a = 2.5,实际打印结果是3.5,原因是在预处理阶段,编译器将a = N/2处理成a = 2+3/2,这就是define宏的边缘效应.
所以应该写成#define N (2+3)
数组指针的初步理解:
1.p:表示的是一个值
p表示的是地址
一个变量的地址称为该变量的‘指针’。
int
p;
p = NULL;
第一行代码,定义了一个指针变量 p,其指向 的内存里面保存的是 int 类型的数据;但是这时候变量 p 本身的值是多少不得而知,也就是 说现在变量 p 保存的有可能是一个非法的地址。第二行代码,给
p 赋值为 NULL,即给 p 指向的内存赋值为 NULL;但是由于 p 指向的内存可能是非法的,所以调试的时候编译器可 能会报告一个内存访问错误。
这样的话,我们可以把上面的代码改写改写,使 p 指向一块合 法的内存:
inti = 10;
int
p = &i; p = NULL;
在编译器上调试一下,发现 p 指向的内存由原来的 10 变为 0 了;而 p 本身的值, 即内 存地址并没有改变。
2.&a[0]和&a 的区别
&a[0]和&a 的值一样,但其意义不一样。前者是数组首元素的首地址,而后者是数组的首地址。
例:
main()
{
inta[5]={1,2,3,4,5};
int
ptr=(int*)(&a+1);
printf("%d,%d",(a+1),(ptr-1));
}
对指针进行加 1 操作,得到的是下一个元素的地址,而不是原有地址值直接加 1。所以, 一个类型为 T 的指针的移动,以 sizeof(T) 为移动单位。
&a +1: 取数组 a 的首地址,该地址的值加上 sizeof(a) 的值,即 &a +5*sizeof(int),也 就是下一个数组的首地址,显然当前指针已经越过了数组的界限。
*(a+1): a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是 a[0]的 首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即 a[1]的首地址,&a+1 是下一 个数组的首地址。所以输出 2 (ptr-1): 因为 ptr 是指向 a[5],并且 ptr 是 int 类型,所以 *(ptr-1) 是指向 a[4] , 输出 5。
3.指针和数组
指针就是指针,数组就是数组,数组大小与元素的类型和个数有关。定义数组时必须指定其元素的类型 和个数。数组可以存任何类型的数据,但不能存函数。,指针变量在 32 位系统下,永远占 4 个 byte,其值为某一个内存的地址。 指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到。

A),int *p1[10]; //指针数组:它是一个数组,数组的元素都是指针。
B),int (*p2)[10]; //数组指针:它是一个指针,它指向一个数组。
4.数组名a作为左值和右值的区别:
a 作为右值时其意义与&a[0]是一样,代表的是数组首元素的首地址,而不是数组 的首地址;a 不能作为左值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值