指针变量的定义
指针变量和其他变量一样,在使用之前要先定义,一般形式为
类型说明符 *变量名;
其中 “ * ” 表示一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
在计算机内存中,每一个字节单元都有一个编号,称为地址。
指针变量的引用
在C语言中,内存单元的地址称为指针,专门用来存放地址的变量,称为指针变量,指针变量的值只能是变量的地址。(“&”来表示变量的地址:&变量名;)
一般形式如下:
<存储类型> <数据类型> *<指针变量名>;
指针的存储类型是指针变量本身的存储类型。
指针说明时指定的数据类型不是指针变量本身的数据类型,而是指针目标的数据类型。简称为指针的数据类型。
指针在说明的同时,也可以被赋予初值,称为指针的初始化。
一般形式是:
<存储类型><数据类型>*<指针变量名>=<地址量>
例:int a , *p=&a; 把变量a的地址作为初值赋予int型指针p。
步骤:1、int *p 声明指针 2、p=&a; 指针取地址
指针所指向的内存区域中的数据称为指针的目标。
如果它指向的区域是程序中的一个变量的内存空间,则这个变量称为指针的目标变量。指针的目标变量简称为指针的目标。
例: int a = 10; 10是目标,a是p的目标变量。
int * p;
p = &a; &a为a变量在内存起始地址。
向一个指针变量赋值时,送的值必须时地址常量或指针变量,不能是普通整数(除0外)。
把一个已有地址值的指针变量赋给具有相同数据类型的另一个指针变量;
例:
float a , * px , *py ; px = &a ; py = px ;
把一个数组的地址赋给具有相同数据类型的指针。
例:
int a[20] , *pa ;
pa = a ; 等价于 pa = &a[0] ;
指针的关系运算
运算符 | 计算形式 | 意义 |
+ | p+n | 指针向地址大的方向移动n个数据 |
- | p-n | 指针向地址小的方向移动n个数据 |
++ | p++或++p | 指针向地址大的方向移动1个数据 |
- - | p- -或- -p | 指针向地址小的方向移动1个数据 |
- | p-q | 两指针之间相居左隔数据元素的个数 |
p-q 两指针相减的结果值不是地址量,而是一个整数值,表示两指针之间相隔数据的个数。
指针与一维数组
数组是有一定顺序关系的若干变量的集合,占用连续的存储空间。集合中的每个变量也被称作数组的元素。
数组元素的地址是指数组元素在内存中的起始地址。可以由各个元素加上取地址符“&”构成。
例:&a[0]表示数组中第一个元素地址。
数组名就代表了数组的起始地址。
例: int a[10] ; a 和 &a[0] 这两个表达式是相等的。
数组元素的表示
例:“ *(a+2)” 就是取指针 a 后面第二个对象的内容。
int a[5] = { 1,2,3,4,5} ;
int * p , * q ;
p = a ; 或 p = &a[0] ; 也可以
q = &a[3] ;
例: q = p ++ ; 先将p的值赋予q,然后p 的值再增加。
例:
int a [] ={ 5,8,6,7,6} ;
int y , * p = &a[1] ; * p = a[1] = 8
y = ( * - -p ) + + ; 先算括号内,- - p, 将* p 向上移动,* p = 5 。先赋值再++,y=5
打印y 和a[0] 再++,a[0] 变为5+1 = 6
数组的指针是指数再内存中的起始地址,数组元素的地址是指数组元素在内存中的起始地址。
一维数组的数组名是一维数组的指针(起始地址)
一维数组a的第i个元素,有下标法和指针法。假设指针变量p指向数组的首元素。则有四种数组元素的表达方式;a[i] = p[i] = * (p+i) = * (a+i)
例·: int a[10] , * p ; p = a ;
下标法:
地址 | 元素 | |
a | a[0] | *a |
a+1 | a[1] | *(a+1) |
a+2 | a[2] | *(a+2) |
a+3 | a[3] | *(a+3) |
指针法:
地址 | 元素 | |
p | a[0] | *p = p[0] |
p+1 | a[1] | *(p+1) = p[1] |
p+2 | a[2] | *(p+2) = p[2] |
p+3 | a[3] | *(p+3) = p [3] |
数组名 + i =数组名[i]
数组名就是数组的起始地址。例: int a[10] = &a[0]
多维数组
多维数组就是具有两个或两个以上下标的数组。
在C语言中,二维数组的元素连续存储,按行优先存。可把二维数组看作由多个一维数组组成。
例:int a [3] [3] 含有三个元素:a[0],a[1],a[2] 。 元素 a[0], a[1] , a[2]都是一维数组名
a[3] [2] 分为 a [0] [0] a[0] [1] = a[0] = * a
a[1] [0] a[1] [1] = a[1] = * (a+1)
a[2] [0] a[2] [1] = a[2] = * (a+2))
二维数组名代表数组的起始地址,数组名加一是移动一行元素。因此二维数组名常被称为行地址。
存储行地址的指针变量,叫做行指针变量。形式如下:
<存储类型> <数据类型> ( * <指针变量名> ) [ 表达式 ] ;
例: int a[2] [3] ; int ( * p ) [3] ;
方括号中的常量表达式表示指针加1,移动n个数据
例: a + i → * (a+i) → * ( a + i ) + j → * ( * (a+i) + j )
走 i 行 改变性质 走 j 列 取值
变为一级指针
二维数组的特点 :1、 数组名+1 表示移动一行 例:a+1 。 2、 地址常量。 3、 行地址