黑马程序员 -- C语言 指针 其他类型

第五讲 指针 其他类型

A.指针类型

1.指针提供了一种用来使用地址的符号的方法,由于计算机的指令硬件很大程度上要依赖于地址,所以指针使您以类是计算机底层的表达方式来表示自己的意识。数组名同时是该数组首元素的地址。也就是说,如果age是一个数组,那么下面的是对的;

age = &age[0]; //数组名就是数组首元素的地址。

指针变量的定义:

//格式:变量类型 *变量名

//指针就是用于存储地址的。仅仅能存储地址而已

//64bit编译器中,指针分配的是8字节存储空间

Int  *p;

Int a = 90;

P = &a; //把a元素的地址给了P。继而P中存放的是a元素的地址

//上面三行代码过后,在内存中的分配是:


//*p的意识是:访问p中存放的存储空间地址的值。

*p = 10;

//经过这样赋值后a原来是90,现在a的值已经是10。

2.指针的认识

a.在C中,对一个指针加1的结果是对该指针增加1个存储单元,对于数组而言,地址会增加到下一个元素的地址。
b.指针保存的数值就是它所指向的对象的地址。地址的内部表示方式由硬件来决定,都是以字节编址的。这意味者要对每个内存字节顺序进行编号,比如double类型的数据,对象的地址通常指的是其首字节的地址。
c.在指针前运用运算符*就可以取得到该指针所指向的对象的值。
d.下面的等式体现了C指针的优点;
date + 2 = = &date[2]   /*相同的地址*/
*(date + 2) == date[2] /*相同的值*/
e.*(date + 2)的意思是:寻址到内存中的date,然后移动2个单位(移动2 x 类型所占内存字节数),再取出数值。

 

3.函数形参数改变实参数据

//函数过程是:在主函数运行是,分配给一定内存给主函数,在运行int a = 90;时,在主函数的内存中分配内存给a并且保存了数据90.在运行函数调用change(int n)时,跟函数change分配一定的内存,并且给形参变量也分配内存。在调用的时候形参内存中保存的值为90。

接下来在执行change函数中赋值 n = 10; 后,n的值从90变成了10。


//如果要改变变量的值,必须传递地址才可以。


//下面在传递的时候可以同时获取函数中的两个值。利用指针变量获取实参数的值,再通过返回值获取另外一个值。


//指针使用注意点

//不建议的写法,int *p只能指向int类型的数据

Int *p;

Double k = 10.0;

P = &k;

//指针变量只能存储地址

Int *p;

P = 200;

//指针变量未经初始化,不要拿来间接访问其他的存储空间

Int *p;

Printf(“%d”, *p);


4.指向指针的指针


5.不同类型指针所占字节数

Char c; //1

Int a;   //4

Long b; //8

//在64bits编译其状态下指针占用8字节,在32bits中指针可能占用4字节。

Char *cp; //8

Int *ap; //8

Long *bp;//8

Printf(“cp = %zd ap = %zd bp = %zd”,sizeof(cp), sizeof(ap), sizeof(bp)) ;


a.指针为什么会分类型

//以下打印出来c = 1;(变量c和指针是同种类型变量)

char c = 1;

char *cp;

p = &c;

printf(“c = %d”, *p);

//下面这种情况就不同了,输出结果就变成了513了。

char c = 1;

int*cp;在这个地方修改了。

p = &c;

printf(“c = %d”, *p);


//用表格来表示指针内部存储显示形式。


Int *p代表在内存中分配8个字节存储。在接下来p =&c;可以知道,指针p存储的是c的地址,那么接下来指针所指向的就是从ffc5开始读取8个字节数据。继而*p的二进制表示就是0000 0000 0000 0000 0000 0010 0000 0001。所以指针和需要给指针的变量必须是同种类型,这样在读取的时候,就不会出现内存套用的情况了。

6.指针和数组、字符串

a.指针和数组

Int age[] = {10, 8, 7, 56, 45, 78};

Int *p;

//指针变量指向数组首元素地址

P = &age[0];

//同样也可以这样写

P = age;

//这块代码在内存中的表现形式是;


b.指针和字符串

//这样写字符串为变量

char name[] = “it”;

//”it” = ‘i’ + ‘t’ + ‘\0’

//指针变量name2指向字符串的首字符,这样定义的是字符串常量

Char *name2 = “it”;

//在内存中的表现形式为:分为:常量区、堆、栈中;

常量区:存放一些常量字符串

堆:存放对象

栈:存放局部变量、数组、字符串变量


//以下字符串保存在同一个地址,这样表明他们是常量


//定义字符串可以用两种方式来实现


7.返回指针的函数

//指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的

//返回指针的函数的一般形式为:类型名 * 函数名(参数列表)

 

//函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。

定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);


//由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的

//指向函数的指针变量主要有两个用途:

//调用函数

//将函数作为参数在函数间传递


 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值