8.1指针是什么?
由于通过地址能够找到所需要的变量单元,可以说,地址指向该变量单元。打个比方,一个房间的门口挂了一个房间号2008,
这个2008就是房间的地址,或者说,2008“指向”该房间。因此,将地址形象地称为“指针”。意思是通过它能找到以它为地址的内存单元。
1.地址和内容
2.值和类型
1). int a=112,b=-1;
float c=3.14;
int *d=&a;
int *e=&c;
在这些声明中,变量a与b确实为用于整型数值,但是c声明为浮点数;上图,c的值确是整型。
这是取决于他们的使用方法,不能简单地通过检查一个值的位来判断它的类型
类型 | 值 |
1个32位整数 | 1735159650 |
2个16位整数 | 26476和28514 |
4个字符 | glod |
浮点数 | 1.116533*e14 |
机器指令 | beg.+110和beg.+102 |
一个单一的值被解释为五个不同的类型,显然,值的类型取决于它的使用方法而非它的固有特性。
3.指针变量
int a=112,b=-1;
float c=3.14;
int *d=&a;
float *e=&c;
如果你认为和e的值分别为112和3.14,那么你就错了,d和e被声明为指针并不会改变这些表达式的求值方式。一个变量的值就是分配给这个变量内存位置所储存的值。
d和e的值应该是a与c数值在内存单元的地址;
4.未初始化的指针和非法指针
例子:
int *a;
……
*a=12;
这个声明创建了一个名叫a的指针变量,后面那条赋值语句是把12储存在a所指向的位置。
但是a到底指向哪?我们声明了一个指针变量,但未对它初始化。我们无法得知12到底储存在哪里?
指针变量和其他变量一样,如果变量是静态的,它会被初始化为0;但如果是自动的,它不会被初始化。无论哪种情况,声明一个指向整形的指针都不会“创建”用于储存整型值的内存空间。
如果程序执行这个操作,有可能a的初始值是一个非法的地址,这样的赋值语句将会出错,从而终止程序;另一种情况可能指向一个合法的地址。接下来这个位置的值会被修改,像这种类型的错误非常难以捕捉,所以在对指针进行间接访问之前,要非常小心,确保已经初始化。
5.怎样定义指针变量
类型 * 指针变量名
1_指针变量名前的“*”,表示变量为指针变量,变量名为p;而不是*p;
2_在定义指针变量是必须指定基类型。一个指针变量只能指向一个类型的值;
3_指向整型数据的指针类型为“int *”;读作“指向int的指针”。
4_指针变量中只能存放地址;不能将一个整数赋给一个指针变量。
6.怎么引用指针变量
(1).给指针变量赋值。
int *p;
p=&a;
1_&是取地址符。&a是a的地址。
2_*指针操作符(“间接访问”运算符),*p代表指针变量p指向的对象。
二.指针变量作为函数参数
#include<stdio.h>
int main()
{
void swap(int *p1,int *p2);
int a,b;
int *p1,*p2;
printf("please enter a and b:");
scanf_s("%d,%d",&a,&b);
p1=&a;
p2=&b;
if(a<b)
swap(p1,p2);
printf("max=%d,min=%d\n",a,b);
getchar();
getchar();
return 0;
}
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
注意:不能通过改变指针形参的值来使指针实参的值改变。
三,数组元素的指针
指针变量可以指向变量,也可以指向数组元素,所谓数组元素的指针就使数组元素的地址。
可以用一个指针变量指向一个数组元素。例如:
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p;
p=&a[0];
这是使指针变量p指向a数组的第0号元素,
p=&a[0]与p=a;使等价的;
1.在引用数组指针时指针的运算;
对地址进行的算数运算,对地址进行乘除的运算时没有意义的,在一定条件下可以进行加减运算。
当指针指向数组元素时,指针变量p指向数组元素a[0],我们希望用p+1表示指向下一个元素a[1];
在指针指向下一个数组元素时,可以对指针进行以下运算:
1_加一个整数(+或+=),如p+1;
2_减一个整数(用-或-=),如p-1;
3_自加运算,如p++,++p;
4_自减运算,如p--,--p;
5_两个指针相减,如p1-p2(只有p1与p2都指向一个数组的元素时,相减才有意义)。
如果指针变量p已指向数组的元素,则p+1指向同一数组中的下一个元素;同理,p-1则指向上一个元素。
这里的p-1和p+1,里面隐藏了一个乘法——p-1=(p-x*1),这里的x表示数组元素的类型的字节数,例如:int型,x=4;float型,x=4;
重点:*(p+5)与*(a+5)和a[5]是等价的。
说明:[ ]实际上是变址运算符,即将a[i]按a+i计算地址,然后找出地址单元中的值