1. 内存单元的编号( 即内存单元的地址 ) :指针 . 有时也叫内存单元的指针。
2. 指针时常量,指针变量才是变量( 即值为地址的变量)。
3. 变量的指针,就是变量的地址,存放地址的变量是指针变量。
4. 指针的定义:a. 指针类型说明(*) b. 指针变量名 c.指向的变量的数据类型
int * p
c a b
5. 二维数组是以行为首地址。(详细参考另一篇)
6. int * p p为指向整型数据的指针变量。
int *p[4] 指针数组 ( 此数组中存放着指向整型的指针)
int (*p)[4] p为指向含有4个元素的一维数组( 行级别 , 二维数组 )
int *p( int a , int b) p为函数名,函数的返回类型为指针类型,指向int型。
int ( *p )() p为指向一个返回 int 型函数的指针。
int **p p是一个指针变量,它指向一个指向 int 型的指针变量 。
7. c 中字符指针,char *p ; 即可以指向字符串,又可以指向单个字符。
char *p = 'a' ;
char *p = "abcd" ;
指针P ,*P , & P 含义:
8. 只要是指针 , 使用它之前就必须保证指针变量的值是一个有效的值 , 否则就是一个野指针 .
9. free( p ) 过程
首先 free( p ) , 释放内存 . ( 此时 p 为 野指针 , 所以... 并不释放 p 本身的内存 , 而是释放 p 所指向的内存空间 , p本身所占内存很小 )
p = NULL ; ( 防止野指针被乱用 )
10. 指针常犯的错误
未初始化( 设置 NULL )
使用完后 , free之后 , 未设置成 NULl , 并且直接使用, ( 使用 野指针 )
指针操作越界
11. 对指针进行判断时, 常用方法如下
while( pa && pb ) --> 判断指针是否为真, 无法判断 , 只能判断指针是否为 NULL , 野指针不为 NULL , 所以无法判断
12. 指向结构体的指针 , 由于结构体名字不带表结构体的内存地址 , 所以把结构体当做一般变量来看待 , 当需要用到它的地址时 , 要加取地址符号 &
例如一个函数 void DisplayStack(SqStack *ps)
在 main 函数中 : SqStack sq ; DisplayStack( &sq); --> 注意此处就用到了取地址符号 &
结构体的定义如下 :
typedef struct {
int data[50]; /*Save data , 50 is stack size*/
int baseLeft ; /*stack's left base*/
int topLeft ; /*stack's left top*/
int baseRight ; /*stack's right base*/
int topRight ; /*stack's right top*/
}SqStack ;
13. int *p = NULL ; 与 int *p ; p = (int *)malloc(sizeof( int )) ; 区别
首先 , 第一种情况 , p为野指针 , 编译器为 p 申请了内存空间 , 但是只申请了一个保存 p 的内存空间 , 并没有申请 p 所指向的内存空间 , 所以这时候如果你使用 p ,
因为不知道 p 指向哪里 , 所以可能造成内存泄露 . 而第二种情况 , 编译器申请了 2 个内存空间 , 除了申请了一个保存 p 本身的内存空间外 , 还申请了一块 p 指向的
内存空间 , 所以此时使用 p 指向就是合法的。因为已经确定了指向的内存空间 .