什么是指针?
指针是C语言中的一个重要概念,也是C语言的一个重要特色。正确而灵活的运用它,可以有效地表示复杂的数据结构,能动态分配内存,能方便的使用字符串,有效而方便的使用数组。掌握了指针的应用,可以使程序简洁,紧凑,高效。可以说没有掌握C语言,就是没有掌握指针的精华。
为了能说清什么是指针必须说清楚数据在内存中是如何存储的,又是如何读取的。
内存有两个属性,.内存是一个线型的存储空间,一个是地址,一个是地址上存放的数据。我们能通过地址索引到里面的东西。内存区的每一个字节有一个编号,这就是"地址"。如果在程序中定义了一个变量,在对程序进行编译是,系统就会给这个变量分配内存单元。
在C语言中, 有两种访问方式,直接访问和间接访问。
直接访问:a=5
系统在编译时,已经对变量分配了地址,例如,若变量a分配的地址是2000,则该语句的作用就是把常数5保存到地址为2000的单元。
间接访问如:scanf("%d",&a);
调用函数时,把变量a的地址传递给函数scanf,函数首先把该地址保存到一个单元中,然后把键盘接受的数据通过所存储的地址保存到a变量中。
一.初识指针
C语言中,指针是一个特殊的变量,他是存放地址的。假设我们定义了一个指针变量。int *i_pointer用来存放整型变量i的地址。可以通过语句i_pointer=&i,将i的地址(2000)存放到i_pointer中,这时,i_pointer的值就是2000,即变量i所占用单元的起始地址。要存取变量i的值,可以采用间接方式:先找到存放“I的地址”的变量,i_pointer,从中取出i的地址2000,然后取出i的值3.
* : 叫做取值运算符。
&: 取址运算符。
二.指针和指针变量。
知道了变量的地址,就可以通过这个地址来访问这个变量,因此,又把变量的地址成为该变量的“指针”。
C语言中,可以定义一类特殊的变量,这些变量专门用来存放变量的地址,称为指针变量。
三,定义一个指针变量“*”
下面都是合法的定义:
float *pointer_3; //pointer_3是指向float型变量的指针变量。
char *pointer_4; // *pointer_4是指向字符型变量的指针变量。
可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量,
四,在定义指针变量时要注意两点。
1.指针变量前面的“*”,表示该变量类型为指针型变量,一般形式为:
类型说明符 *变量名
其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
例如: float *pointer_1;
指针变量名是pointer_1,而不是 *pointer_1
2.在定义指针变量时,必须指定基类型,需要特别注意的是,只有整型变量的地址才能放到指向整形变量的指针变量中,下面的赋值是错误的:
float a ;
int *pointer_1;
pointer_1=&a;
/*将float型变量的地址放到指向整形变量的指针变量中,是不对的。
五.指针变量的引用“&”
指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量,否则编译器也会把该值当成一个地址来处理。
C语言中提供了地址运算符&来表示变量的地址。
一般形式:&变量名。
如&a表示变量a的地址,%b表示变量b的地址,当然,变量本身必须预先声明
六.对“&”和“*”运算符再做些说明
如果已执行了语句。pointer_1=&a;
(1) & *pointer_1的含义是什么?
“&”和“*”两个运算符的优先级别相同,但自右向左结合,因此先进行 *pointer_1的运算,他就是变量a,在执行&运算。
(2)*&a的含义是什么?
先进行&a运算,得a的地址,再进行*运算,即&a所指向的变量,也就是变量a.
*&a和 *pointer_1的作用是一样的,他们都等价于变量a,即*&a与a等价。
(3)(*pointer_1)++,相当于a++
注意括号是必要的,如果没有括号,就成 *pointer_1++,++和*为同一优先级别,而结合方向自右向左,因此,相当于 *(pointer_1++)。
由于++在pointer_1的右侧,是“后加”,因此先对pointer_1的原值进行*运算,得到a的值,然后使pointer_1的值改变,这样pointer_1不再指向a了。