1.什么是指针?
地址:内存单元的编号就是地址。
指针:保存地址的内存单元就是指针。(指针里面的内容就是指向内容的的地址)
注:指针也是有地址编号的。
2.指向地址的变量,就是指针变量。(char* 、int*...............)
3.一级指针与变量的结合
例:
int a = 10;
int *p =&a;(有取地址符号)
&a:如果a的地址是0x12345678;
p:指针变量就是0x12345678;
*p=10;
p+1:将指针的的0x12345678+4个字节=0x1234567c(int型是4个字节)
4.一级指针和一维数组的结合
例:
char a[5]={1,2,3,4,5};
int *p = a;(a属于常量也是数组的首地址)。
当进行&a操作时是对整个数组进行取地址&a+1时对整个数组的最后一个成员之后的地址。
p指向数组的首地址。
可以对单个元素机型取地址 &a[0]:表示第一个元素的地址也就是首地址。别的元素都如此。
如果难以理解可以认为a是一个指针。(我的理解)
a+1就是对整个数组的第二个元素进行地址的指向。可以理解位p+1(两个操作是对等的)。
不能进行a++操作(a是一个常量,*a++也是错误的:根据优先级会先进行a++操作在进行取*操作,故是错误的)。
a[i]<=>p[i]<=>*(a+i)<=>*(p+i);
5.一级指针和二维数组的结合
例:
int a[][2]={1,2,3,4,5}(可以看为行和列其中列号初始化的过程中必须有,行号可以不写)。
int *p;
a:二维数组的名字也是二维数组的首地址,它是一个常量可以看为一个数组指针(int(*p)[2])。
*a是降维的a[0](int *)。
a[i][j]=*(a[i]+j)=*(*(a+i)+j)=*(p+i*2+j)
a+i是+的i行。
6.二级指针和一级指针的地址结合
例:
int a = 10;
int *p = &a;
int **q = &p;
a=*p=**q=10;
p+1(指向a后面一个元素的地址移动4个字节)
p=*q
q+1(移动了8个字节我们的电脑一般是64位的不管什么类型的指针都是占8字节,32位的指针占4字节)
7.数组指针
它是一个行指针,指针指向一个行地址
int(*p)[2];
char(*q)[4];
后边的数字指向列号。
8.指针数组
它是一个数组,里边的每个元素都是指针。
int *p[3];
9.函数指针
它是一个指针,指向一个函数。
int(*a)(int a,int b);//函数名就是函数的地址
例:
#incldue<stdio.h>
int add(a,b){
return(a+b);
}
int sub(a,b){
return(a-b);
}
int main(){
int(*a)(int,int);
a=add;
printf("%d\n",a(200,300));//500
a=sub;
printf("%d\n",a(300,200));//100
return 0;
}
10.指针函数
它是一个函数,函数的返回是一个指针。
void *func(void);
char *mygets(char *arr,int n);
11.函数指针数组
它是一个数组,每个元素都是一个函数指针
int(*a[3])(int, int);