学C语言的初学者估计是最头疼指针神马的了,大一时候的课程设计搞了半天才弄得稍微明白点~虽然我现在一直在学Java,Java里面并没有指针,习惯了各种对象的“引用”指来指去,这几天数据结构课程设计,重新再看C里面的指针,发现~其实指针并不是那么难~~
先来说一下Java,看下面一段代码:
public class TestMain {
public static void main(String[] args) {
CarInfo c = new CarInfo(123, 123);
CarInfo a = c;
c.setCarTime(23);
System.out.println(c.getCarTime());
System.out.println(a.getCarTime());
int e = 100;
int f = e;
f++;
System.out.println(e);
System.out.println(f);
String s = "123123";
String p = s;
p += "sassadsad";
System.out.println(s);
System.out.println(p);
}
}
PS: CarInfo 是我自己创建的一个类,里面有两个数据。
这段示例代码的输出结果为:
23
23
100
101
123123
123123sassadsad
可以看到a和c所指的是一个东西,但是下面的e和f,s和p就不是一样的了。
计算机里面所有运行的程序都是存在内存中的,程序的运行差不多就是内存中不同区域间的数据交换,而语言就是将这个交换的过程用一种比较好理解的方式表现出来~
CarInfo c = new CarInfo(123, 123);
可以靠理解为,通过new Java开辟了一个新的内存空间用来存储CarInfo对象,然后用c“指向了”这篇内存区域。
CarInfo a = c;
a本来指了c,但是因为c不是内存中的数据,所以a就也指向了c所指的内存。
但是下面的int和String在Java中是数据(String比较特殊,暂且这么理解吧),所以“=”就直接赋值了,也就是说先开了一个内存区域,再把值复制到新的内存区域中去。
用一句话总结~那就是对象采用引用传递(指来指去),而数据就采用的是值传递(对于等于号来说)。
C语言里面没有对象啊~好吧~C语言里大部份都是值传递~就是把等于号右面的数据复制给等于号左面的。下面看一段示例代码:
#includemain() { int a,b; a=1; b=a; b++; printf("a=%d\n",a); printf("b=%d\n",b); getch(); }
可以看到,我修改了b的值,但是a的值不会有改变,如果我想通过修改b来同时也修改a的话,那么就需要用指针了。
C里面定义指针要在变量名前面加一个*
比如说 Car *a;意思就是这是一个指向Car(结构体)的指针;
把上面的程序修改一下:
#includemain() { int a,*b; a=1; b=&a; (*b)++; printf("a=%d\n",a); printf("b=%d\n",*b); getch(); }
现在输出的结果a就变成2了;
简单说明一下:&是取地址符,&a就是说获取a所指向的内存空间的地址,对~你没看错~是“指向”,可以理解为没有*
就是直接指向内存的数据~下面画一张图或许能更好理解~我们假设a=1的内存地址为12345
1是数据,所以存放在内存里,它所对应的在内存中的地址是12345,*b是个指针,它存储的是地址,通过b=&a,让b把a的地址存了下来,存在了内存地址为12346的内存区域中,同理,要是我们新建一个指向指针的指针**c ,那就把指针b的地址给c 代码就为 c=&b;这样c就把b的地址存储在了内存地址为12347的内存中,以此类推~~
总结一下~其实*就是个标志~有*的时候编译器就通过内存的数据找地址,没有的话就直接读内存的数据~&也是这个意思~如果有&就读取这个内存的地址,如果没有就读取这块内存的数据~
希望我写的这些能给刚学编程的童鞋一些小帮助,本人也是小菜一个啊~一起加油吧~