指针学习笔记

1.指针的运算

指针与指针相减, 是计算的地址之间所指向的数据类型的个数

指针和指针不能相加

指针+1, = 指针 + sizeof(void)的地址

2.指针的申明和定义

2.1. 首先应该看是 *q 还是(*q)

   例如 :unsigned char *q[20]:  本质是数组, 是指针的数组.{注}[]的优先级高于*

          unsigned char (*q)[20]: 本质是指针,是一个指向unsinged char型的数指针

          int*fun(int ): 本质是函数, 是一个返回值会指针的函数.

          int(*fun)(int ): 本质是指针, 是一个指向int型函数的指针.

3.指针函数中,返回值千万不能是局部变量的地址

int *fun(int a,int b)

   int *p;

   int c;

   c = a + b;

   p = &c;

   return p;

}

1.大错特错,函数调用位于栈区,函数退出后栈区销毁,指针会变为野指针.

虽然输出结果可能是对的,但是实际上返回的地址已经不受到保护,随时可能被擦出改变.这是很危险的.

static int c; //要想返回局部变量的地址,只有加上static,使这个变量位于静态区.

p = "helloe" ; //字符串常量

char *str = malloc(3); //动态存储区,地址在free后会失效

p = str;

2. 局部指针变量,只要指向的变量的生命期没有结束, 及时局部变量指针的生命期结束,这个地址也是有效的.

   

4.二级指针的使用

函数调用过程中,需要修改普通变量的值,需传递其地址,否则传递普通变量的值即可。

5.函数指针和指针函数的区别

5.1. 指针函数

本质上一个函数,一个返回值为地址的函数,因为返回值为指针,所以一般是int *

int *f(char a, char b);

int *p;

p = f;

5.2. 函数指针

本质上是一个指针,一个指向函数首地址的指针

char  fun (char a, char b);

char (*p) (char a, char b);

 p =fun;

 p 指向了fun()函数的首地址

(注)函数名可以代表函数的地址.

5.3 函数指针的调用方法

handle  func();    //函数定义

handle  *p = func;

p(1,2) ==(*p)(1,2)== func(1,2)//函数调用

6.指针数组和数组指针的区别

6.1 指针数组

         int*a[4]     指针数组

    表示:数组a中的元素都为int型指针   

    元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

6.2 数组指针

int (*a)[4]   数组指针    

表示:指向数组a的指针

元素表示:(*a)[i] 

猜你喜欢

转载自blog.csdn.net/qq_28818443/article/details/80523301