一、指针
-
内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。在地址所标识的内存单元中存放数据,这相当于旅馆房间中居住的旅客。在这里,将地址称为指针。
-
直接访问:直接按照变量名进行访问。
间接访问:将变量i的地址存放在另一变量中,然后通过该变量找到变量i的地址,从而访问i变量。
-
如果有一个变量专门存放另一变量的地址,则称它为指针变量。
-
指针是一个地址,而指针变量是存放地址的变量.
二、指针变量
1.使用指针变量
int a=10; //定义整型变量
int *pointer; //定义整型指针变量
pointer=&a; //将变量a的地址赋给整型指针变量
2.引用指针变量
p=&a; //将a的地址赋给指针变量p
printf("%d",*p); //输出a的值
*p=1; //将整数1赋给指针变量p指向的变量
pritnf("%p",p); //输出指针变量p指向变量的地址
3.& 取地址运算符 * 取内容运算符
4.指针变量作为函数参数
例:交换两个变量的值
void swap(int *p1,int *p2){
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
三、通过指针引用数组
1.“p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”
2.两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义)
3.引用数组元素的三种方法:
下标法,如a[i]形式
指针法,如*(a+i) 其中a是数组名
指针变量法,p是指向数组元素的指针变量,其初值p=a,通过*(p+i)访问
p[i]等价于*(p+i)
4.多维数组的地址
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
四、指向函数的指针
-
函数名代表函数的起始地址
-
定义一个指向函数的指针变量:类型名 (* 指针变量名)(函数参数列表)>
int (*p)(int,int);
p=max;
比较三个数大小
#include <stdio.h>
int max(int x, int y)
{
return x > y ? x : y;
}
int main(void)
{
int (* p)(int, int) = & max; // &可以省略
int a, b, c, d;
printf("请输入三个数字:");
scanf("%d %d %d", &a, &b, &c);
/* 与直接调用函数等价,d = max(max(a, b), c) */
d = p(p(a, b), c);
printf("最大的数字是: %d\n", d);
return 0;
}
五、返回指针值的函数
-
返回值为指针的函数声明
数据类型 *函数名(参数列表)
{
函数体
}
六、指针数组
-
指针数组:一个数组,其元素均为指针类型数据
- 定义指针数组:*类型名 数组名[数组长度]; 例如:
int *p[4];
- 定义指针数组:*类型名 数组名[数组长度]; 例如:
七、动态内存分配
动态分配区域
int main()
{
int *p = (int *)malloc(sizeof(int));
*p = 100;
free(p);
p = NULL;
return 0;
}
malloc函数作用是在内存的动态存储区中分配一个长度为size的连续空间
free函数作用是释放指针变量p所指向的动态空间,使这部分空间能重新被其他变量使用。p应是最近一次调用malloc函数时得到的函数返回值。