标签:can 写入 取数 字符数组 管理 初始 c中 位置 data-
区别:1、字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址)。
2、赋值方式。对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值:char str[20]; str="I love China";而对字符指针变量,可以用如下方法赋值:char *a; a="I love China ";注意,赋值给a的不是字符,而是字符串的第一个元素的地址。
3、对字符指针变量赋初值:char *a="I love China";等价于char*a; a="I love China";而对数组的初始化:char a[20]={"I love China"};不能等价于:char str[20];str[]="I love China";
4、如果定义了一个字符数组,在编译时为它们分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可放一个字符指针变量的地址。也就是说,该指针变量可以指向一个字符型数据,但若未对它赋予一个地址值,则它未具体指向一个确定的字符数据。例:char str[10]; sanf("%s",str); 合法。但:char *a; scanf("%s",a); 有时也可执行,但风险较大。
5、指针变量的值是可以改变的,例:
#include <stdafx.h> #include<stdio.h> void main() { char *a="Hello word"; a+=4; printf("%s\n",a); }
注:指针变量的值(即地址)可以改变,但指针指向的值无法改变。
6、若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。
例:
1 #include <stdafx.h> 2 #include<stdio.h> 3 4 void main() 5 { 6 char *a="Hello word"; 7 int i=0; 8 for(;a[i]!=‘\0‘;i++) 9 {printf("%c",a[i]); 10 } 11 }
7、在内存中的储存位置不同。
例:
#include <stdafx.h> #include<stdio.h> void main() { void copy_string(char*from,char*to); char*a="Hello word"; char*b="I love China"; printf("%s\n%s\n",a,b); copy_string(a,b); printf("%s\n%s\n",a,b); } void copy_string(char*from,char*to) { for(;*from!=‘\0‘;from++,to++;) { *to=*from; } *to=‘\0‘; }
会出错,
1 int a = 0; //全局初始化区 2 char *p1; //全局未初始化区 3 main() { int b; //栈 4 char s[] = "abc"; //栈 5 char *p2; //栈 6 char *p3 = "123456"; //123456\0在常量区,p3在栈上。 7 static int c = 0; //全局(静态)初始化区 8 p1 = (char *)malloc(10); 9 p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。 10 strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。 }
标签:can 写入 取数 字符数组 管理 初始 c中 位置 data-
原文地址:https://www.cnblogs.com/lvfengkun/p/10362975.html