前言
- 本博文的代码基于VC++6.0开发调试;
- 本博文概念比较多,属于学习笔记类型;
具体的区别
- 从概念上来说:数组就是数组,指针就是指针,数组存数据,指针存地址;
- 赋值方式:可以对字符指针变量赋值,但是不能对数组名赋值;
字符指针变量的赋值方式:
#include<stdio.h>
void main()
{
char *a; //定义一个字符型指针变量;
a = "I Love China!";//将字符串“I Love China!”字符串的首地址赋值给字符型指针变量a;
printf("%d\n",a);
printf("%d\n",a+1);
printf("%d\n",a+2);
printf("%s\n",a);
}
运行结果:
可以一个其他的结论:虽然在程序中,我们并没有定义一个字符串数组,但是实际上,编译器确实为“I Love China!”这个没有字符串名的字符串开辟了内存空间,并用指针a指向起始地址;
3.从初始化含义上
char *a = "I Love China!"; //对于字符指针变量初始化;
/*等价于:
char *a;
a = "I Love China!";
注意:字符指针变量赋的字符串是一个常量,是不能改变的;而字符数组的元素是可以改变的;
*/
char str[30] = "I Love China!"; //对数组的初始化;
/*但是:
char str[30];
str[] = "I Love China!";
*/
4.从存储单元的内容和大小来说:
不管什么数据类型的指针变量,VC++编译器都为其分配4个字节的存储空间,用来存储地址,而字符数组的存储空间是根据数据类型的不同而不同,VC++为字符数组分配每个字符一个字节的空间(字符串数组的还有一个结束标识符);
注意:当定义一个指针变量后,应当及时对其进行赋值操作,因为未初始化的定义指针变量,指针的指向是随机的,它可能会指向内存中的空白区,也同样有可能指向内存中的数据存储区,若不及时对指针变量进行赋初值,一旦进行赋初值操作,可能会破坏电脑软件,系统等,相当危险;一个可采取的操作如下;
char *a = NULL; //NULL代表空,即a被初始化指向空地址;
5.从值的可变性来说:
指针变量的值是可以改变的,无非就是地址的改变;
数组名的值是不能改变的,它只能指向本数组的首元素地址;
6. 数组元素的引用:
字符数组可以用下标法:
str[1];
地址法:
*(str+1);
字符指针可以用指针变量带下标法:
p[1]; //效果和上面str[1]一样;
地址法:
*(p+1); //注意:如果指针变量并不是指向数组,则不能用这种方法;
7.从指向的内容值的角度看:
字符数组内的元素,都是变量,值是可以改变的;
但是字符指针数组内的元素的值并不是变量而是常量,常量不能发生改变;例如:
#include <stdio.h>
void main()
{
char str[] = "I Love China!";
char *p = "I Love You!";
str[2] = 'W'; //欲改变第三个数组元素的值;
printf("%s\n",str);
p[2] = 'W'; //欲改变第三个数组元素的值;
printf("%s\n",p);
}
运行结果:
编译器在这里并没有报错,但是结果并没有正确输出,那么如果注释掉p[2] = ‘W’;错误将不会出现;那么就说明,此处或许不是语法上的错误,而可能是逻辑上的错误;需要注意;
8.指针字符串的一个特殊功能:代替printf()函数的格式控制函数(可变格式输出函数),例如:
#include <stdio.h>
void main()
{
char *control_format = "%c\n%s\n%d\n";
char ch = 'A';
char str[] = "I Love You!";
int i = 10;
printf(control_format,ch,str,i);
}
运行结果: