C语言的字符指针变量和字符串数组的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuyuzun/article/details/82597369

前言

  1. 本博文的代码基于VC++6.0开发调试;
  2. 本博文概念比较多,属于学习笔记类型;

具体的区别

  1. 从概念上来说:数组就是数组,指针就是指针,数组存数据,指针存地址;
  2. 赋值方式:可以对字符指针变量赋值,但是不能对数组名赋值;
    字符指针变量的赋值方式:
#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);
}

运行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/wuyuzun/article/details/82597369