黑马程序员——指针的应用

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

第一讲 指针

一.指针的基本概念

在计算机中,所有的数据都是存放在存储器中的,一般把存储器的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型占4个单元,字符量占1个单元等。为了正确的访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确的找到该内存单元。内存单元的编号也叫做地址,根据内存单元的编号或地址就可以找到所需的内存单元,所以通常又把这个地址称为指针。

内存单元的指针和内存单元的内容是两个不同的概念。

例:账号是内存地址;卡里存的钱是实际内容。

二.使用指针的好处

1.    为函数提供修改调用变量的灵活手段

2.    让函数有多个返回值

3.    可以改善某些子程序的效率

4.    在数据传递时,如果数据快较大(比如说数据缓冲区或比较大的结构),这时就可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存。

5.   为动态数据结构(如二叉树/链表)提供支持。

三.变量的存取方式

变量的存取方式分为:直接存储和间接存储

int a=3;

1.    直接存储:变量的赋值和取值(通过变量名进行存取值)

例如:int b=a;

2.    间接存储:通过指针(地址)间接操作完成。

 

第二讲 指针变量的定义及概念

一.指针变量的概念

在C语言中允许用一个变量来存储指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元地址或称为某内存单元的指针。

注意:

严格意义上说:指针是一个地址,是一个常亮。

指针变量是存放一个地址,是一个变量。

二.定义指针变量

对指针变量的定义包括三个内容:

1.     指针类型说明,即定义变量为一个指针变量;

2.     指针变量名;

3.     变量值(指针)

其一般形式为:类型说明符 *变量名;

其中*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。

例如:

int *p;   //定义了一个指针变量,变量名是p

           //int表示,p只能存放一个int类型的变量的地址

 char *p1; //定义了一个指针变量,变量名是p1

                //p1只能存放一个char类型数变量的地址

在定义指针时,“*”号表示定义的变量是指针变量,变量的值只能存放地址。

1.     一个类型的指针只能指向同类型的变量,不能指向其他类型的变量。

2.     指针也可以被声明为全局,静态局部和局部的。

第三讲 指针变量的初始化和指针应用场景

一.指针变量的初始化

 指针变量的使用: 定义指针变量  ----> 初始化指针变量 ---> 使用(使用指针变量间接的存取内存单元的值)。

指针变量应该用地址进行初始化。

 1.定义的同时初始化

//定义两个变量,并且给变量进行初始 a = 4, b = 5
    int a=4,b=5;

(1)完全初始化

int *p = &a; //用a的地址初始化 p这个指针变量(p指向了a)

(2)部分初始化

int *p3 = &b,*p4;  //定义了两个指针变量 p3 p4
p4 = &b;

2.先定义后初始化

int *p7;
p7 = &a;  

注意:

如果一个指针变量定义以后,如果不进行初始化,这个指针变量存放的事一个垃圾数,这个指针变量,称之为 野指针。一定要避免操作野指针,因为可能会带来意向不到的错误。

二.指针的应用场景

1.在被函数中可以修改主调函数中的变量的值

/**
 *  定义了一个函数
 *  在函数内部通过指针变量修改指针变量指向的内容
 */
void changeValue(int *p){
    *p = 100;
}
int main(int argc, const char * argv[]) {
    int a=1;
    int *p1=&a;
    changeValue(p1);
    printf("%d\n",a);
}
2.让函数可以有多个返回值,并不是有多个return
void caculator(int x,int y,int *add,int *jian,int *cheng,float *chu){
    //在函数的内部访问了主调函数中的变量值
    *add = x+y;
    *jian = x-y;
    *cheng = x*y;
    *chu = x/(float)y;
}
int main(int argc, const char * argv[]) {
    int add=0;
    int jian=0;
    int cheng=0;
    float chu=0.0f;
    
    caculator(12, 4, &add, &jian, &cheng, &chu);
    printf("add = %d\n",add);
    printf("jian = %d\n",jian);
    printf("cheng = %d\n",cheng);
    printf("chu = %.2f\n",chu);
    
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值