1.指针
在内存中通过地址访问变量单位,将地址形象化地称为指针。
通过变量名对变量进行访问称为“直接访问”。
通过指针存储变量地址,通过指针访问变量称为“间接访问”。
- 简而言之:一个变量的地址称为该变量的"指针"
如果有一个变量专门存放另一个变量的地址(指针),则该变量为“指针变量”
2.指针变量
2.1如何定义指针变量?
定义指针变量的一般形式为:
类型名 *指针变量名
类型名是定义指针变量必须指定的“基类型”。对于每一个类型,内存中所占字节不同,如一般编译器int型为4字节,指针访问下一个变量时,就需要在该地址的基础上加上4个字节。变量名前的*代表该变量为指针变量。
一个变量的指针包含两个方面的信息,存储单元编号表示的地址,如内存中编号为m的字节。另一个是存储单元的数据类型。
指针变量只能存放地址,将一个整数赋值给一个指针变量不合法。
例1
#include<stdio.h>
int main()
{
int a=100;
int *p=&a;
printf("%d %d %o",a,*p,p);//输出a的值,以八进制输出p指向的地址
return 0
}
指针变量p指向整形变量a的地址,通过*访问变量a的值
2.2如何引用指针变量
1.给指针变量赋值p=&a;
2.引用指针变量指向的变量,如果指针已被赋值,*p则是a的值,也可以重新赋值,如*p=3,修改a的值
3.引用指针变量的值,通过printf输出p的值(地址)
4.例2通过交换指针变量指向实现交换变量a,b的值。
例2
#include<stdio.h>
int main()
{
int a=2,b=3;
int *p1=&a,*p2=&b;
printf("before swap\n a=%d b=%d\n",*p1,*p2);
int *temp;
temp=p1;
p1=p2;
p2=temp;
printf("after swap\n a=%d b=%d",*p1,*p2);
return 0;
}
2.3指针变量作为函数参数
通过修改指针指向变量的值
例3
#include<stdio.h>
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int main()
{
int a=2,b=3;
int *p1=&a,*p2=&b;
printf("before swap\n a=%d b=%d\n",*p1,*p2);
swap(p1,p2);
printf("after swap\n a=%d b=%d",*p1,*p2);
return 0;
}
运行结果:
分析:通过值传递将p1,p2传入函数中,互换*p1和*p2的值,从而达到交换a,b的值
能否通过函数调用直接修改指针变量的指向(值)?
例4
#include<stdio.h>
void swap(int *p1,int *p2)
{
int *temp;
temp=p1;
p1=p2;
p2=temp;
}
int main()
{
int a=2,b=3;
int *p1=&a,*p2=&b;
printf("before swap a=%d b=%d\n",*p1,*p2);
swap(p1,p2);
printf("after swap a=%d b=%d",*p1,*p2);
return 0;
}
结果:
分析:显而易见,不能,为什么?
这就要引入一个知识点:
值传递方式
实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,不能由形参传给实参。实参和形参在内存中占有不同的存储单元,实参无法得到形参的值
这样就可以解释这个问题了。
不能企图修改指针形参的值而使指针实参的改变,C语言中实参变量和形参变量之间的数据传递时单向的“值传递”。用指针变量作函数参数时同样要遵循这一规则。即不能通过执行调用函数来改变实参指针变量的值,但可以改变指针变量所指的变量的值。
3.数组元素的指针
3.1一维数组:
上文所说,指针即对象的地址,那么数组的指针就是数组的地址。如果将数组的首元素地址赋值给指针变量,那么引用数组元素可以下标法也可以用指针法,指针法能使目标程序质量高(占内存少ÿ