定义一个字符串数组
char str[10];
定义一个字符串指针变量
char * str;
前者是表示定义一个10个字符长度的数组,str表示该字符数组的首地址,这里的str是一个地址常量,不可以修改。
而后者定义一个字符型的指针变量str,这里的str是一个变量,一个用来存贮字符型数据单元的地址的一个变量,它是可以修改的。
对于一个指针变量,它首先也是一个变量,变量就是一个存储数据的单元,只是特殊的是,这里存贮的数据是一个地址。
那么针对char * str中的str表示的就是这个指针变量里面的内容(也就是一个地址值)。
比方说
我先定义一个字符变量 char s = 'a';
然后将str这个指针指向s变量,那么str里面存储的就是s的地址,那么*str表示的是什么?我理解为,这里的*号表示一种寻址的方式,
就像汇编语言中的间接寻址指令中用到的@符号。所以*str就是一种间接寻址,也就是说按照str里面的地址去找到那个变量,然后
获得找到的这个变量的值。既然是一个变量当然就可以对它执行某些操作,比如说加减,这是由意义的,应为地址的加减操作对应着
地址的量的偏移。而乘除法显然是没有意义的,所以不能对一个指针变量执行乘除操纵。
对于定义的字符数组char str[10]中的str来说,这里的str指的是这个数组的第一个元素的地址,是一个地址,也就是说一旦这个数组定义了
那么这就是一个确定的值了,没法改变的东西了,因此它是固定不变的,当然也不存在说对于一个地址常量的运算操作了。
这里想到了一个问题,唐浩强版的c程序设计一书中说到过一个例子,当时没完全明白,现在想想到是清楚一些了(第三版的P258)
中提到如下这样做事不正确的:
char * a;
scanf("%s" , a);
当时不理解,为什么这样是不安全的呢?scanf不是就是需要一个地址参数,a变量中就是用来存储变量的啊。
确实对于指针变量a,当中存储的确实是地址变量,但是当申明一个指针变量时,在编译的时候确实要给变量a分配内存单元,也就是说a这个
变量时占据了一定的空间块的。但是这个时候,a变量并没有初始化啊,也就是说它没有指向任何的地址单元,a当中的值是不可预料的。
所以说如果这个时候我们用scanf去将输入的数据存储,那么是存储到什么地方呢?
如果a当中的那个不可预知的值,恰好是一段空闲的内存单元,那也许会没问题,但如果这个未知的值是指向一块有用的内存呢,那样
就会破话其他的程序。我在用vc调试的时候是会出现内存不可写的错误的。可见这种做法确实不可取。
所以如果要实现上面的功能,那么就得将a指向一个确定的内存区域,比如说:
char * a;
char b[10];
a = b;
scanf("%s",a);
当然这个时候最好不要是的a的长度大于b数组的长度,应为一旦超出了对应的数组的长度,那么和上面的一样,也可能会覆盖其他
程序的内存区域啊,好无疑问,这个是危险的。
总结一下,指针也是一个变量,这个变量存储的是一类特殊的数据类型,存储单元的地址。
为什么c可以直接操作底层的硬件?就在于c的指针,应为我们可以得到存储单元的地址,就可以直接接触存储单元,这意味着什么呢?
呵呵,想想就知道了。