欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言指针

程序员文章站 2022-06-24 10:16:00
第6章 指针 第6章 指针1. 指针2. 指针变量的类型说明3. 指针变量的赋值4. 指针变量的运算5. 数组指针变量的说明和使用6. 指向多维数组的指针变量7. 使用字符串指针变量与字符数组的区别8. 函数指针变量 1. 指针 2. 指针变量的类型说明 3. 指针变量的赋值 ......

第6章 指针









1. 指针

  1. 指针简介:所有的数据都是存放在存储器中。一般把存储器中的一个字节称为一个内存单元,为了正确的访问这些内存单元,必须在每个内存单元编上号,根据一个内存单元的编号即可准确的找到该内存单元;内存单元的编号也可叫为地址;即根据内存单元的编号或地址就可以找到所需的内存单元,通常也把这个地址称为指针
    对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内存,用一个变量来存放指针,这种变量称为指针变量;一个指针变量的值就是某个内存单元的地址或称为某个内存单元的指针
    “指针”是指地址,是常量;“指针变量”是指取值为地址的变量;定义指针的目的是为了通过指针去访问内存单元

2. 指针变量的类型说明

  1. 对指针变量的类型说明
    1) 指针类型说明,即定义变量为一个指针变量
    2) 指针变量名
    3) 变量值(指针)所指向的变量的数据类型
    其一般形式: 类型说明符 *变量名
    其中 ***** 表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型

3. 指针变量的赋值

  1. 指针变量的赋值:只能赋予地址,决不能赋予任何其他数据;提供了地址运算符 & 来表示变量的地址,一般形式: & 变量名; 如&a表示变量a的地址,&b表示变量b的地址。 变量本身必须预先说明。设有指向整型变量的指针变量p,如要把整型变量a 的地址赋予p可以有以下两种方式:
    (1)指针变量初始化的方法
1 int a;
2 int *p=&a;

 

(2)赋值语句的方法

1 int a;
2 int *p;
3 p=&a;

 

不允许把一个数赋予指针变量,故下面的赋值是错误的: int *p;p=1000; 被赋值的指针变量前不能再加“*”说明符,如写为 *p=&a; 也是错误的

4. 指针变量的运算

  1. 指针变量是可以进行某些运算,只能进行赋值运算 和 部分算术运算及关系运算
  2. 指针运算符
    1) 取地址运算符 &: 是单目运算符,其结合性是自右至左,其功能是取变量的地址
    2) 取内容运算符 * : 是单目运算符,其结合性是自右至左,用来表示指针变量所值的变量

  3. 赋值运算
    1) 指针变量初始化赋值
    2) 把一个变量的地址赋予指向相同数据类型的指针变量

1 int a, *pa;
2 pa = &a;

 

  1. 3) 把一个指针变量的值赋予指向相同类型变量的另一个指针变量

1 int a, *pa = &a, *pb; 
2 pb = pa;

 

  1. 4) 把数组的首地址赋予指向数组的指针变量

1 // 数组名表示数组的首地址,故可赋予指向数组的指针变量pa
2 int a[6], *pa; pa = a;
3 // 数组第一个元素的地址也是整个数组的首地址
4 pa = &a[0];

 

  1. 5) 把字符传的首地址赋予指向字符类型的指针变量

1 // 初始化赋值的方式
2 // 并不是把整个字符串装入指针变量,而是把存放该
3 // 字符串的字符数组的首地址装入指针变量
4 char *pc = "C Language"

 

  1. 6) 把函数的入口地址赋予指向函数的指针变量

1 // f为函数名
2 int (*pf)(); pf = f;

 

  1. 加减算术运算:对于指向数组的指针变量,可以加上或减去一个整数n,指针变量加或减一个整数n的意义:是把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置
    1) 因为数组有不同的类型,各种类型的数组元素所占的字节长度不同;如指针变量加 1,即向后移动 1 个位置表示指针变量指向下一个数组元素的首地址,而不是原地址基础上加 1

1   int a[5], *pa;
2     pa = a;      // pa指向数组a,也是指向a[0]
3     pa = pa + 2;       // pa指向a[2],即pa的值为&pa[2]

 

  1. 2) 指针变量的加减运算只能对数组指针变量进行,对指向其它类型变量的指针变量作加减运算是毫无意义的
    3) 两个指针变量之间的运算只有指向同一数组的两个指针变量之间才能进行运算
    4) 两指针变量相减:所得之差是两个指针所指数组元素之间相差的元素个数
    5) 两指针变量进行关系运算:指向同一数组的两指针变量进行关系运算可表示他们所指数组元素之间的关系:
    pf1 == pf2表示pf1和pf2指向同一数组元素
    pf1 > pf2表示pf1处于高地址位置
    pf1 < pf2表示pf2处于低地址位置
  • 设 p 为指针变量,则 p == 0 表明 p 是空指针,不指向任何变量; p != 0; 表示不是空指针;#define NULL 0 int *p = NULL; 对指针变量赋0值和不赋值是不一样的,为赋值时,可以是任意值,但不能使用,将造成意外错误;赋0值后,可以使用,只是不指向具体的变量而已

5. 数组指针变量的说明和使用

  1. 数组指针:指向数组的指针变量。
    一个数组是由连续的一块内存单元组成的,数组名是这连续内存单元的首地址,一个数组也是由各个数组元素(下标变量) 组成的,每个数组元素按其类型不同占有几个连续的内存单元,一个数组元素的首地址也是指它所占有的几个内存单元的首地址。一个指针变量即可以指向一个数组,也可以指向一个数组元素,可把数组名第一个元素的地址赋予它;如要使指针变量指向第 i 号元素可以把 i 元素的首地址赋予它或把数组名加 i 赋予它
  2. 数组指针变量说明:一般形式: 类型说明符 指针变量名
    其中类型说明符表示所指数组的类型
    引入指针变量后,可以用以下方式访问数组元素:
    · 下标发:即用 a[i]形式访问数组元素
    · 指针法:即采用
    (pa + i)形式,间接访问的方法来访问数组元素

6. 指向多维数组的指针变量

  1. 多维数组的指针变量:是一种地址计算方法,表示数组 a 第 i 行首地址。因此我们得出:a[i], &a[i], *(a + i), 和 (a + i) 都是相同的
    a[0]也可以看成 a[0]+0是一维数组 a[0]的0号元素的首地址,而 a[0]+1 则是 a[0] 的1号元素首地址,由此得出 a[i]+j 则是一维数组 a[i] 的j号元素首地址,他等于 &a[i][j];a[i] = *(a+i)a[i]+j = *(a+i)+j 由于 *(a+i)+j 是二维数组 a 的 i 行 j 列元素的首地址; 该元素的值等于 *(*(a+i)+j)
  2. 二维数组的指针变量:其一般形式:类型说明符 (*指针变量名)[长度]; 其中”类型说明符“为所指数组的数据类型;“*” 表示其后的变量是指针类型;“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也是二维数组的列数;

7. 使用字符串指针变量与字符数组的区别

  1. 都可以实现字符串的存储 和 运算,两者区别的说明:
    1) 字符串指针变量本身是一个变量,用于存放字符串的首地址;而字符串本身是存放在以该首地址为首的一快连续的内存空间中并以"\0"作为串的结束。字符数组是由于若干个数组元素组成的,可用来存放整个字符串
    2) 对字符数组做初始化赋值,必须采用外部类型或静态类型,如:static char st[] = {"C Language"};; 而对字符串指针变量则无次限制;如:char *ps = "C Language"
    3) 对字符串指针方式:char *ps = "C Language" 可以写为:char *ps; ps = "C Language"; 而对数组方式不能写成:char st[20]; st = {"C Language"};只能对字符数组的元素逐个赋值

8. 函数指针变量

  1. 函数指针变量:一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。可以把函数的这个首地址(入口地址)赋予一个指针变量,使该指针变量指向该函数,然后通过指针变量就可以找到并调用这个函数。
    函数指针变量定义的一般形式: 类型说明符 (指针变量名)(), ""表示后面的变量是定义的指针变量;最后的空括号表示指针变量所指的是一个函数

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">