什么是指针

int *p
    p指针名;
    *间接运算符

指针的类型

int *p :去掉指针的名字int *(指针本身具有的类型)

指针所指向的类型

int *p :去掉*和名字

指向一维数组的指针:int (*p)[5]

    int (*p)[5]  按优先顺序读,先*,指针里的内容指向数组
    做形参:接受二维数组首地址,可以按行访问二维数组;

指针数组:int *p[5]

int *p[5]  按优先顺序读,先[],数组里的内容是指针

指针的运算

puts();输出字符串函数
int *p; p++;
p是指针,指向首地址,每加一次,就是内存地址移动sizeof(int)

指针的值

指针所指向的内存区

指针表达式

一个表达式的结果是一个指针

指向多维数组的指针

int (*p)[m] :可以用来接收二维数组的首地址,m为列数;
约束这个指针的两个条件:1、它所指向数组的类型
2、访问二维数组中每行的元素个数(列数)
int a[]={10,20,30};
int (*p)[m] = &a;
int *p[m] :指针数组的说明符
int a=10,b=20,c=30;
int *p[3]={&a,&b,&c};

//多维数组中字符串排序 ss[N][M]={"create","modify","sort","skip","delete"};
void fun(char (*ss)[M]){//指针里的内容是数组构成的--第一个字符串首地址
    char *ps[N],*tp; //数组里的内容是指针构成的---每一个字符串的首地址 
    int i,j,k;
    for(i=0;i<N;i++) ps[i]=ss[i];
    for(i=0;i<N-1;i++){//每一个字符串和第一个字符型进行相互比较,找出最大的字符串,交换位置
        k=i;
        for(j=i+1;j<N;j++)
            if(strlen(ps[k])<strlen(ps[j])) k=j;
            tp = ps[i]; ps[i]=ps[k];ps[k]=tp; 
    }
    printf("\nThe string after sorting by length:\n\n");
    for(i=0;i<N;i++) puts(ps[i]);
}

指向函数的指针

int f();//f函数名就是函数的首地址
int (*p)();//指向函数的指针
p =f;

结构体

struct students{
int a;
}stu;

1、结构体变量的成员:
stu.a;
2、结构体指针:
stu *p;
p->a;