黑马程序员——C语言基础---指针1

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

一、指针的概念

1、什么是地址? 

(1)计算机硬件系统的内部存储器中,拥有大量的存储单元(容量为1字节)。为了方便管理, 必须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个惟一的 地址。

内存地址──内存中存储单元的编号 

(2)在地址所标识的存储单元中存放数据。 

注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。 

变量地址── 系统分配给变量的内存单元的起始地址   

2、指针的基本概念? 

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

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

总结:对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的

二、指针变量概念及定义方法 

1、指针变量 

在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
注意:
严格意义上说,指针是一个地址,是一个常量
指针变量是存放一个地址,是一个变量。

图中:变量i_pointer 就是一个指针变量,查看k=i+j;的存储过程。 

2、定义一个指针变量 

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

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

2)指针变量名;

3)变量值(指针) 

其一般形式为: 

类型说明符 *变量名; 

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

注意: 

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

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

3)指针也可以被声明为全局、静态局部和局部的。 

三、指针变量的初始化和引用

1、指针变量的初始化方法 

设有指向整型变量的指针变量p,如要把整型变量a 的地址赋予p可以有以下两种方式: 

指针变量初始化的方法有两种:定义的同时进行初始化和先定义后初始化

1)定义的同时进行初始化 

int a = 5; int *p = &a;  

2)先定义后初始化 

int a; int *p; p=&a;  

3)把指针初始化为

NULL int *p=NULL;

int *q=0; 

不合法的初始化: 

1)指针变量不能被赋值一个整数值(因为我们不知道这个整形常量是内存哪块地址 2)被赋值的指针变量前不能再加“*”说明符,如写为*p=&a 也是错误的  

注意点: 

1、多个指针变量可以指向同一个地址 

2、指针的指向是可以改变的 

3、指针没有初始化里面是一个垃圾值,这时候我们这是一个野指针, 如果操作一个野指针 

1)可能会导致程序崩溃 

2)访问你不该访问数据 所以指针必须初始化才可以访问其所指向存储区域 

2、使用“*”获取指针对应存储区域的内容 

指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的 指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,决不能赋 予任何其它数据,否则将引起错误。在C语言中,变量的地址是由编译系统分配的,对用户完全透 明,用户不知道变量的具体地址。 

两个有关的运算符:

& :取地址运算符;

* :指针运算符(或称“间接访问” 运算符)。  

#include <stdio.h>
int main(int argc, const char * argv[]) {  
    //定义两个变量,并且给变量进行初始 a = 4, b = 5
    int a=4,b=5;
    //先定义变量,然后在初始化变量值
    int a1;
    a1 = 10;    
    //1) 定义的同时进行初始化
    //     1)完全初始化
           int *p = &a;  //用a的地址初始化 p这个指针变量//另外一种描述方法:p指向了a   
           int *p1 = &a,*p2 = &a; //p1 p2都指向了a
    //     2)部分初始化
           int *p3 = &b,*p4;  //定义了两个指针变量 p3 p4
           p4 = &b;
    //2)先定义后初始化    
        int *p7;
        p7 = NULL;     
    //3)如果定义了一个指针变量,但是我不知道让这个指针指向谁
    int *p5 = NULL;  //NULL 是空(0)
    int *p6 = 0;     //空    
    //把一个指针赋值一个空,什么也不指    
    p6 = p1;  //p6指向了a

    //2、用*来获取指针变量指向的存储单元的内容
    int value = *p1;  //4
    //给指针变量指向的内存单元赋值
                *p1 = 100;
        value = *p1;  //100
    printf("value = %d\n",a);
    //"*" 的两种用法
    // 1) 用于定义一个指针变量
    // 2) 存储指针变量指向的存储空间的内容
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值