字符指针的特殊之处
来源:百度文库 编辑:神马文学网 时间:2024/04/29 18:57:32
定义:
(1)int a=7; int *p=&a; 或者
(2)int a=7; int *p; p=&a; 或者
(3)int a=7; int *p; *p=a;
(1)这样定义的原因是因为等号两边的类型必须匹配,int *p=&a; 等号左边定义的是一个指针,指针的内容是地址,所以等号右边也应该是地址,&a就是取空间a的地址;
(2)int *p; p=&a; 为什么不是 *p=&a 而是 p=&a; 因为在定义的时候“*”只是说明p是一个指针,而p也是一个变量,不过是储存地址的一种特殊的变量,对于变量使用,我们都是直接使用它的名字,就好象,我们定义个常量 const a=7; 我们要调用它的时候直接使用a就可以了,并不需要带上 const 修饰,这里也一样,用指针变量时并不需要带上“*”;
(3)而第三种情况中的 *p=a;中的“*”和第二种里面是不同的,这里的“*”是取内容符,与之相反的是取地址符“&”,分析一下,第三种情况中,等号左边是*p表示对指针p取内容,它的内容指向内存中的某个已经在开始通过 int *p; 定义好的空间里(比较确切一点的说法是,p在定义的时候,其内容里的地址指向内存中某个未知的空白区域,即未占用,不受保护的内存空间),这个空间里存放的数据类型是整型,所以等号的右边也应该是整型才能匹配,所以是 *p=a; 这里的“*”和定义时候的是不同的,这一点很重要。
其实上面的都是些题外话,我要说的其实是关于指针的输出的一些问题。我们利用上面定义好的进行输出操作。
输出指针的内容(即所指向空间的地址):cout<
输出指针所指的内容(即指针内容所描述地址空间中的内容):cout<<*p< 方式2 cout<<*p< 虽然通常情况下我们是不需要了解我们的数据地址的,但我也顺便说说,怎么得到字符指针的地址,也可以方便大家对内存地址的分配再做更深入的研究。
比如,我们定义一个 char a='A'; char *p=&a; 如果我们调用上面非字符指针的输出方式,结果如下:
方式1 cout<
你肯定会说,为什么要这样呢,这样多不方便呀,其实这么做是有目的的,而且恰恰就是为了方便才这么设置的。因为这样就可以很容易的处理字符串了,而处理字符串是我们在计算机中用得很多的操作。
比如我们第一个字符串数组 char a[]="mantou"; a[]在内存中在7个字节,而不是6个,因为在mantou字符串后面还隐藏有一个“\0”,这时我们用 char *p=a; (这里不用&a是因为,a[]是一个数组,数组名a本身就是一个指针常量) 输出操作 cout<
char a='A'; 如果这里直接输出 cout<<&a<