哈,我们得到了a的值!
也就是说,当我们有p = &a,我们可以用*p得到a的值。
那能不能操作呢?当然可以。
我们可以把*p当做a的值,那么,我们尝试如下代码:
得到输出:
指针p指向的地址的值:10
指针p指向的地址的值:13
指针p指向的地址的值:16
指针p指向的地址的值:13
指针p指向的地址的值:117
指针p指向的地址的值:39
指针p指向的地址的值:0
棒极了!我们可以用指针来操作变量了。
那么,我们要这个干什么用呢?请看下一节:实现交换函数
交换函数是指针必学的一个东西。一般的交换我们会这么写:
t = a; a = b; b = t;那么我们把它塞到函数里边:
void swap(int a,int b){ int t; t = a; a = b; b = t; }好,我们满怀信心的调用他:
#include <stdio.h> void swap(int a,int b){ int t; t = a; a = b; b = t; } int main(){ int x = 5,y = 10; printf("x=%d,y=%d\n",x,y); swap(x,y); printf("x=%d,y=%d",x,y); }于是乎,你得到了这个输出:
x=5,y=10
x=5,y=10
啊啊啊啊啊啊啊啊,为什么不行!!!
问题就在你的swap函数,我们来看看他们做了些啥:
各位同学,函数体内有任何一点谈到了x和y吗?
所谓的交换,交换的到底是a和b,还是x和y?
我相信你这时候你恍然大悟了,我们一直在交换a和b,并没有操作x和y
那么我们怎么操作?指针!
因为x和y在整个程序中的地址一定是不变的,那么我们通过上一节的指针运算可以得到,我们能够经过指针操作变量的值。
那么,我们改进一下这个函数
我们再来试试,然后你就会得到报错信息。
我想,你是这么用的:swap(x,y)。
问题就在这里,我们看看swap需要怎样的两个变量?int*和int*类型。
怎么办?我告诉你一个小秘密:
任何一个变量加上&,此时就相当于在原本的类型加上了*
什么意思?也就是说:
那么,我们要这么做:swap(&a,&b),把传入的参数int换为int*
再次尝试,得到输出:
x=5,y=10
x=10,y=5
累死了,总算是搞好了
Part 5:char*表示字符串char*这个神奇的类型可以表示个字符串,举个例子:
#include <stdio.h> int main() { char* str; str = "YOU AK IOI!"; printf("%s",str); }请注意:输入和输出字符串的时候,都不能带上*和&。
你可以用string.h中的函数来进行操作
Part 6:野指针有些同学他会这么写:
int* p; printf("%p",p);哦千万不要这么做!
当你没有让p指向某个地方的时候,你还把他用了!这个时候就会产生野指针。
野指针的危害是什么?
第一种是指向不可访问(操作系统不允许访问的敏感地址,譬如内核空间)的地址,结果是触发段错误,这种算是最好的情况了;
第二种是指向一个可用的、而且没什么特别意义的空间(譬如我们曾经使用过但是已经不用的栈空间或堆空间),这时候程序运行不会出错,也不会对当前程序造成损害,这种情况下会掩盖你的程序错误,让你以为程序没问题,其实是有问题的;
第三种情况就是指向了一个可用的空间,而且这个空间其实在程序中正在被使用(譬如说是程序的一个变量x),那么野指针的解引用就会刚好修改这个变量x的值,导致这个变量莫名其妙的被改变,程序出现离奇的错误。一般最终都会导致程序崩溃,或者数据被损害。这种危害是最大的。
不论如何,我们都不希望看到这些发生。
于是,养成好习惯:变量先赋值。
指针你可以这么做:int *p =NULL;让指针指向空
不论如何,他总算有个值了。
Part 7:总结本文干货全部在这里了:
指针是个变量,他的类型是数据类型+*,他的值是一个地址,他自身也有地址
指针有两个专属运算符:&和*
指针可以操作变量,不能操作常量
指针可以表示字符串
请注意野指针的问题
本文没有讲到的:
char[],char,const char的区别与联系
const修饰指针会怎么样?
void*指针的运用
多级指针的运用
NULL到底是什么
malloc函数的运用