1、指针和一维数组的关系
int arr [10] = {1,2,3,4,5,6,7,8,9,0};
数组名是一个指针常量,表示数组第一个元素的的起始地址。
如 int a[5]; a表示数组第一个元素a[0]的起始地址&a[0]。
换句话说:数组名就是数组的首地址。
arr[0] = 1; arr[2] = 3;
arr[1] = 2; arr[3] = 4;
int *p;
p = arr; //一个一级指针指向了一个一维数组,那么指针的偏移和数组的偏移是一模一样的。
*(p+0) 的值等于 arr[0] (p+2) 的值等于 arr[2]
*(p+10 的值等于 arr[1]
*(p+0) ==1; //指针偏移后解引用;
*(p+1) ==2;
数组名可以理解为是一个被const修饰的指针,绝对不可以改变其指向,因为一旦改变了指向,那么就没有人可以找到该数组的位置。
2、指针和字符数组的关系
char []可以来储存多个字符。
例如:
char ch[6] = {'h','e','l','l','o','\0'}; //当char[]最后一个字符为‘\0’时,是一个字符串。
char ch[6] = "hello";
char ch[] = "hello";
//以上储存在栈内存中,可以被修改。
char *p = "hello"; //储存在常量区,不可以被修改。
3、指针数组,数组指针
指针数组:是一个数组,只不过其中的每一个元素都是指针。
语法:数据类型 *数组名[数组大小] int *p[5]
int a,b,c;
int *p[4] = {&a,&b,&c,NULL} ;
例如主函数中:
int main(int argc,char *argv[])
主函数的栈区有一个叫argv的数组,这个数组的元素是你输入的参数的地址,指向着只读数据区。
例如:
char p[4] = {“abc”,“asd”,“qwe”,“xyz”};
p就是我定义的一个指针数组,他有四个元素,每个元素都是char 类型的指针,指向字符串常量。
数组指针:本实质是一个指针,专门用来在数组之间偏移固定大小。
语法:数据类型 (*变量名)[一次偏移的大小] int(*pa)[5];
pa是一个指针指向一个char [5]的数组。
pa的一次偏移是5个int数的大小,专门用来指向二维数组。
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
4、指针和函数的关系
函数传参
值传递:仅仅将自己的值赋值给形参
地址传递:将自己的地址交给形参,可以通过形参修改其值
指针函数:返回值是一个指针的函数就叫指针函数
char *my_strcpy()
{
代码;
return NULL;
}
函数指针:本质上是一个指针,用来保存某个函数的入口地址,函数名就是函数的入口地址
如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。
用法:函数返回值类型 (* 指针变量名) (函数参数列表);
int (*p)(int a,int b);//如果想保存某个函数的地址,就将该函数原封不动的复制过来,将函数名改为指针名
//该函数指针类型:返回值为int,参数为两个整型数的类型
int func(int a); //声明一个函数
int (*p) (int b); //定义一个函数指针
p = func; //将func函数的首地址赋给指针变量
赋值时函数 func 不带括号,也不带参数。由于函数名 func 代表函数的首地址,因此经过赋值以后,指针变量 p 就指向函数 func() 函数的首地址了。
例如:
#include <stdio.h>
int sub(int a,int b)
{
return a-b;
}
void fun(int a,int b,int (*p)(int a,int b)) // 定义函数指针作为参数
{
printf("%d\n",p(a,b));
}
void main(int argc,char *argv[]) //主函数 调用fun函数时 第3个参数是函数名。
{
fun(1,2,sub);
}