什么是指针
指针的本质就是变量,可以是各种数据类型。它存的值为另一个变量的地址。但指针也有属于它自己的地址。
指针变量的一般形式为:
指针的基本类型 *指针变量名称
注: * 是用来指定一个变量是指针。
以下都是有效的指针声明:
int *p; //整型指针
float *p; //单精度浮点型指针
double *p; //双精度浮点型指针
char *p; //字符型指针
含义:定义一个 *p,其中 p 就需要一个地址(可用 & 符号获取其变量的地址再赋值给 p ),而*p,是一个具体的值,及取地址后获得的值。
例如:
#include
#include
int main()
{
int a=5;
int *p;
p=&a;
printf("%d %d\n",*p,a);
printf("%x %x\n",p,&a);
printf("%x\n",&p);
system("pause");
return 0;
}
输出结果为:
a (变量名)
5 (值 ) |
24fd60 (地址) |
p (变量名)
24fd60 (值) |
24fd54 (地址) |
现在 p 就存的是 a 的地址,*p 取地址,就取的是 p 所存地址的值(a)5。&p为 p 自身的地址,因为 p 本身也是一个变量,所以他自身也有地址;
指针的作用
我们了解了指针的概念和本质后,我们要了解,学习指针到底有什么用。
在讲它之前呢,先讲一下我们在学习函数时讲过一个东西--值传递
#include
#include
void swap1(int a,int b)
{
int c;
c=a;
a=b;
b=c;
}
int main()
{
int a=10,b=100;
swap1(a,b);
printf("%d %d\n",a,b);
system("pause");
return 0;
}
运行结果为:
指针在C语言中的重要用途 :指针允许你以更简洁的方式引用大量数据结构
指针可以使程序的不同部分能够共享数据,如下:
用指针来进行操作:
指针的经典例题:
#include
#include
void swap2(int *a,int *b)
{
int c;
c=*a;
*a=*b;
*b=c;
}
int main()
{
int a=10,b=100;
swap2(&a,&b);
printf("%d %d\n",a,b);
system("pause");
return 0;
}
输出结果为:
在这里就体现了指针的作用,它是对数据的地址直接进行操作的。在main函数第三行中,将 a 和 b 的地址传给了子函数,直接在子函数中运用指针将 a 和 b 的值进行了交换。
指针与数组的关系
由于编译器为每个变量都分配了一个地址,如果编译器需要一个地址来执行某种操作时,就可以直接进行操作。并不需要增加指令首先取得具体的地址。如下:
int a[10];
数组的数组名就是数组的首地址。
在上面的代码中, a 就代表整个数组的首地址,编译器会给数组 a 分配一个空间,但不会为 a 本身分配空间。
#include
#include
int main()
{
int a[10];
printf("%x\n",a);
printf("%x\n",&a[0]);
system ("pause");
return 0;
}
输出如下:
数组指针(行指针)
含义:是指针----指向数组的指针。
其一般形式为:
int (*p)[10];
其中 括号 () 的优先级最高,故 p 先与 * 结合,首先说明 p 是一个指针,指向一个整型的一维数组。数组的长度为10,要执行p+1时,p要跨过10个整型数据的长度。
如下图所示:
int (*p1)[10] (p1为指针变量名)
int |
int | int | int | int | int | int | int | int | int |
p1 是一个指针,它指向一个包含10个int类型数据的数组,即数组指针。
如果将二维数组赋给一指针,如下:
int a[3][4];
int (*p)[4];//指向含四个元素的一维数组
p=a;//将二维数组的首地址赋给p
p++;//该语句执行后跨过行a[0][]指向a[1][]
所以说数组指针也称为一维数组的指针,亦称行指针。
指针数组
含义:是数组----装着指针的数组。
一般形势为:
int *p[10];
其中 [] 的优先级高,先于 p 结合成为一个数组,再由 int* 说明这是一个整型指针数组,它有 10 个指针类型的数组元素。也就是说现在 p 就代表的不是一个指针了,而 p[0],p[1],p[2]...p[9] 是指针,它现在赋值就应该为:
int a[3];
int *p[3];
*p=a;
此时 *p 就等于p[0],即 *(p+n) == p[n]。而赋值就变成了 *(p+1)=(a+1);将数组 a 中的第 n 个元素赋值给指针数组 p 。因为这里 int *p[3],表示一个数组内 存放着 三个指针变量,分别是 p[0],p[1],p[2] 所以要分别复制。
如下图所示:
int *p2[10]
int * | int * | int * | int * | int * | int * | int * | int * | int * | int * |
数组指针 只是一个指针变量,是C语言里专门用来指向二维数组的,它占有一个指针的存储空间。
指针数组 是多个指针变量以数组的形式存储在内存中,占有多个指针的内存空间。
比如要表示数组中 i 行 j 列的一个元素: *(p[i]+j)、*(*(p+i)+j)、(*(p+j))[j]、p[i][j]
优先级: () > [] > *