关于指针的总结归纳
1.指针的含义:指针即是地址
2.指针的定义:
`变量类型 变量名
int a
函数类型 函数名
int a();
数组类型 数组名
int a[];
类比可得 指针类型 指针变量名
int * a;
指针赋值方法:
一,取地址符赋值
int a;
int *p=&a;
二.数组名赋值;数组名即数组元素首地址
int a[10];
int *p=a; //等效于 int *p=&a[0];
三.指针之间可以相互赋值
3.指针的四要素:
3.1指针类型
3.2指针的值:指针在使用前必须给赋值,否则为野指针,不能被调用
3.3指针指向地址里的值的类型 :指针变量的类型要与指向地址里的值类型
3.4指针变量自身占内存空间; 32位系统占4字节,64位占8字节
4.指针的典型案例
例子一
#define uchar unsigned char
uchar a,b,c,d,e,f,g,x,y,z;
40H 41H 42H 43H 44H 45H 46H 47H 48H
uchar niu[10]={3, 7, 9, 21, 28, 34, 100, 200, 250};
uchar *sp;
sp=niu; //指针指向数组首地址40H,其等效于 sp=&niu[0];
a=*sp; //3 *sp代表sp指向的地址40H的值 sp=40H,*sp=3
b=*sp+1; //4 *sp=3; b=*sp +1 =4
c=*sp++; //3 等效于*(sp++),++在后是先执行完这串代码再加加。
//*sp=40H;后指向改变指向指向41H,sp=sp+1=41H;
d=*sp; // 7 指向41H,*sp为41H地址里的值
e=*(sp++); // 7 括号优先级最高,但是指多目运算单目运算不受影响,和e=*sp++等价
a+3*5 (a+3)*5 (a)+(3)*5 e=7然后sp=sp+1 sp指向42H
f=*(sp+1); // 21 sp指向的是42H,sp+1为43H,*(sp+1)是指向43H地址的值21
g=*sp; //9 上一步代码指向没有变化,为42H,
x=*(sp+sizeof(sp)); //sp为指针。一般系统为4位,sizeof为4,x=*(sp+4),
//sp指向还是42H,
y=*(sp-sizeof(*sp)); //*sp是指的是指向地址的值,sizeof的值为uchar大小
//sp指针指向也没变
5.指针数组
int niu[10]; int数组niu的类型 ,niu数组名,又是数组首地址
niu[0];数组niu首地址里面的数,niu[0]数组元素
int *a[10];//int * 指针数组a变量名的类型
a[0]; *a[0];指针a[0]的 uchar *sp;
sp指针变量名 uchar * 指针类型
指针数组的定义格式
类型标识 *数组名[整型常量表达式];
例如: int *a[10]; 指针数组和一般数组一样,
允许指针数组在定义时初始化。
指针数组的每个元素是指针变量, 它只能存放地址。
所以对指向字符串的指针数组在说明赋初值时,
是把存放字符串的首地址赋给指针数组的对应元素。
uchar *sp[10];
uchar niu[]=“edu118”;
sp[0]=niu;
*sp[0]=niu;
6.指针函数
指针函数是指带指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。
类型标识符 *函数名(参数表)
int *f(x,y);
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
表示
float *fun();
float *p;
p = fun(a);
7.函数指针
函数指针是指指向函数的指针,根本是指针
#include <stdio.h>
void fun(char a,int b);
int main(void)
{
void (*p)(char a,int b);
p=fun;
(*p)('c',90); //显式调用
p('b',80); //隐式调用
return 0;
}
void fun(char a,int b)
{
printf("the argument is %c and %d\n",a,b);
}
显示调用和隐式调用区别略
函数指针的定义方法
函数返回参数 指针名 函数的形参,
void (*p) (char a,int b);
注意函数指针定义是要与指向的函数类型一致,包括返回值,形参变量
8指针函数和函数指针结合有返回指向函数的指针
int (* fun(int))(int *,int)
分成两部分理解
int (*p)(int *,int)返回类型
和fun(int)函数
9.指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。