题记

指针其实很萌哒,乃们不要黑她。

指针妹子的介绍

指针其实个单纯的妹子 我认识她的时候指针是这样介绍自己的

1
2
3
4
5
int a = 0;
int *pa = NULL;
pa = &a;
*pa = 5;
printf("*(%p)=%d\n", pa, *(pa));

你们不觉得指针的基本用法就是上面写的这几个么。。。

麻烦的是指针的那些狐朋狗友 可惜啊 C语言里面很多东西都是指针的狐朋狗友 而且很多东西离不了指针 今天我简单列举一下C语言里面指针的狐朋狗友 可能不全 而且很多地方没法解释的很清楚 欢迎各位补充

注意 以下的很多代码是错误的 千万不要把错的学会了

指针和静态存储区域不能不说的故事

1
2
char *p = "指针妹子我爱你!";
p[4] = '\0'; //WRONG

用指针访问也无法改变字符串是在静态存储区域的事实 在这个程序里面 静态存储区域就是不能改了 除非使用特殊手段或改编译参数

正确的是

1
2
char p[] = "指针妹子我爱你!";
p[4] = '\0';

这里相当于[]内会自动加一个数让这个字符串够 这是数组 是在堆栈分配的 所以可以改

指针和堆栈不能不说的故事

是不是我用堆栈就好了呢 不是的。。。

1
2
3
4
5
char *func(void)
{
char p[] = "指针妹子我爱你!";
return p; //WRONG
}

这里 由于函数在退出的时候函数的堆栈就销毁了 所以 指向已经销毁的内存的指针也是无意义的 这种指针不要也罢

指针和内存分配不能不说的故事

看来我用内存分配就好了 这样就不会出错了罢

1
2
3
int *p = malloc(1024*sizeof(int));
...
p = NULL; //这样就释放了这块内存了罢 //WRONG

上述用法除了会带来内存泄露不会有什么其他的事情发生 释放的正确方法是free()函数

当然 在指针释放后将指针赋值为NULL是个好习惯 可以减少错误的发生 而且在使用指针的时候可以判断一下指针是否是NULL 但这只能减少 无法避免 这是C的内存管理机制决定的 该发生的还是会发生

指针和「变量交换」不能不说的故事

1
2
3
4
5
6
7
void swap(int *pa, int *pb)
{
int *pt = NULL;
pt = pa;
pa = pb;
pb = pt;
}

这里只不过在函数内部交换了两个变量 而不是通过变量交换两个值 所以这个函数其实什么都没做 一旦这个函数返回了 函数的堆栈销毁了 连美好的回忆都剩不下的 正确的是

Update: 首先要知道C语言都是传值的 所以这里只不过把两个指针的值 注意是指针的值也就是指针变量的内容 给了这个函数 然后再这个函数里面 这两个参数交换了一下顺序 然后呢 然后没有了 这样的话 函数退出后 swap()里面的这些参数啦 局部变量啦 都没了 而因为是传值的 所以对调用的时候的 swap(&i, &j);i j 没有任何的影响

1
2
3
4
5
6
7
void swap(int *pa, int *pb)
{
int t = 0;
t = *pa;
*pa = *pb;
*pb = t;
}

指针和自增/自减不能不说的故事

指针的加法/减法加的其实是指针变量指向的类型的大小(例子待补充)

指针和「数组退化为指针」不能不说的故事

待补充

指针和const不能不说的故事

待补充

没人看懒得写了