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

作者&投稿:巩楠 (若有异议请与网页底部的电邮联系)
字符数组名与字符串指针变量名的区别2009-01-19 19:08授课内容:

一、字符串指针变量的说明和使用

字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。

对指向字符变量的指针变量应赋予该字符变量的地址。如: char c,*p=&c;表示p是一个指向字符变量c的指针变量。而: char *s="C Language";则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。

请看下面一例。main(){
char *ps;
ps="C Language";
printf("%s",ps);
}
运行结果为:
C Language

上例中,首先定义ps是一个字符指针变量, 然后把字符串的首
地址赋予ps(应写出整个字符串,以便编译系统把该串装入连续的一
块内存单元),并把首地址送入ps。程序中的: char *ps;
ps="C Language";等效于: char *ps="C Language";
输出字符串中n个字符后的所有字符。

二、字符指针变量的运算

main(){
char *ps="this is a book";
int n=10;
ps=ps+n;
printf("%s\n",ps);
}
运行结果为:
book

在程序中对ps初始化时,即把字符串首地址赋予ps,当ps= ps
+10之后,ps指向字符“b”,因此输出为"book"。

main(){
char st[20],*ps;
int i;
printf("input a string:\n");
ps=st;
scanf("%s",ps);
for(i=0;ps[i]!='\0';i++)
if(ps[i]=='k'){
printf("there is a 'k' in the string\n");
break;
}
if(ps[i]=='\0') printf("There is no 'k' in the string\n");
}
本例是在输入的字符串中查找有无‘k’字符。

三、字符串指针作为函数参数的使用。

要求把一个 字符串的内容复制到另一个字符串中,并且不能使用strcpy函数。函
数cprstr的形参为两个字符指针变量。pss指向源字符串,pds指向目标字符串。表达式: (*pds=*pss)!=`\0'

cpystr(char *pss,char *pds){
while((*pds=*pss)!='\0'){
pds++;
pss++; }
}
main(){
char *pa="CHINA",b[10],*pb;
pb=b;
cpystr(pa,pb);
printf("string a=%s\nstring b=%s\n",pa,pb);
}

在上例中,程序完成了两项工作:一是把pss指向的源字符复制
到pds所指向的目标字符中,二是判断所复制的字符是否为`\0',若
是则表明源字符串结束,不再循环。否则,pds和pss都加1,指向下
一字符。

四、使用字符串指针变量与字符数组的区别

用字符数组和字符指针变量都可实现字符串的存储和运算。 但两者是有区别的。在使用时应注意以下几个问题:

1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。

2. 对字符数组作初始化赋值,必须采用外部类型或静态类型,如: static char st[]={“C Language”};而对字符串指针变量则无此限制,如: char *ps="C Language";

3. 对字符串指针方式 char *ps="C Language";可以写为: char *ps;
ps="C Language"; 而对数组方式: static char st[]={"C Language"};不能写为: char st[20]; st={"C Language"};而只能对字符数组的各元素逐个赋值。

从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。

前面说过,当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。因此, char *ps="C Langage";或者 char *ps; ps="C Language";都是合法的。

你这个问题问得很好,我们知道实际上一个字符串在进行赋值的时候,例如: char *p="hello world";这样赋值是允许的。那么这并不代表"hello world"这个就是一个指针,实际上我们的这一动作,编译器在幕后为我们做了很多事,首先在常量区分配一个字符数组,然后将"hello world"这个字符串中的字符(包括最后的'\0'字符。)拷贝到此数组(其实此数组我们可以看成是一个匿名数组,因为没有数组名)。然后返回数组首元素的地址,将此地址赋值给字符指针变量p。我们知道在c语言中没有字符串这种类型,在c语言中的字符串是通过字符数组来实现的,而且必须要求此字符数组具有'\0'结束符。这就是字符串与一般的字符数组不同的地方。

话说回来,你问到为什么char *p="hello world"; cout<<p<<endl;打印出来的是字符串,而不是地址。其实当初我也想到过类似的问题,没有找到权威的答案,但是我能够猜出几分。C++语言是兼容C语言的,所以在输出C串的时候是直接以给出的首地址,输出,直到遇到结束符'\0'结束。为什么会这样呢,我想着应该是语言的特性,或者是编译器的特性。既然C语言中字符串是通过带'\0'的字符数组实现的,那么请问如果编译器是由你来实现的,或者是printf()函数是你写的,要输出一个字符串的话你会怎么样呢,你是不是会输出指针的地址呢,cout<<p<<endl;这样的形式让读者一目了然,我要输出的就是一个字符串,而实际上p就是一个字符指针变量而已,为什么输出字符串,这在于cout的实现了,cout的实现我不的而知,但是可以肯定的是cout确实在遇到字符指针的时候会将做出这样的行为:将此指针当做首地址,向下输出字符,直到遇到'\0'结束为止。 这就是cout的行为,没有为什么。 其实你自己可以写一个自己的cout函数,输出地址而不是按照cout的默认行为。当然要实现cout的功能,必须要了解很多底层知识。

我们可以通过这样的方式输出字符指针的值,而不是输出以其为首地址的字符串。例如char a='A'; char *p=&a; cout<<(int)(p)<<endl; 只需要将指针的值(地址值实际上在内存中就是一个整数,标识了内存的地址,只不过编译器认为其实指针类型罢了,实际上从本质上来说,计算机中的任何类型在内存中都是以二进制的形式存在的,根本没有所谓的类型之分。为什么有类型,这就是编译器将底层抽象的结果)。

字符数组是一块连续的存储若干个字符的地址里的值
字符指针变量是一个地址,这个指针的有效范围可能是1个地址,也可能是某一块连续的地址

char *s是个指针,char s[]是个数组,用做函数声明的参数时,都可以

char s[]这样写出来以后s就固定了,不能改变它的值.
如果用在函数传参的话,char *s 与char s[]没区别.

字符数组是申请好的一块空间;数组名就是首元素的地址,己经固定,不能改变.
字符指针变量是指向某一个字符的指针变量.它可以改变.

字符指针变量和字符数组的区别~

简单说一下:
字符(非字符串数组,字符数组和字符串数组是有区别的,字符串数组每个元素都是一个字符串)数组是用来存放字符的数组,在内存中占一段连续的单元。所占内存存放的是字符串。定义方法为:char a[N];N为常量表达式,可初始化。字符指针是指向字符的指针,所占内存单元存放的是所指字符的内存单元。定义方法为:char *p;

完整的解答:
1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的地址(字符串第一个字符的地址),决不是将字符串放到字符指针变量中
2)赋值方式
对于字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值:
char str[14];
str = "I love you!";
而对于字符指针变量,可采用如下赋值:
char *a;
a = "I love you!";
赋值给a的是字符串第一个元素的地址
3)对字符指针赋初值
char *a = "I love you!";
等价于
char *a;
a = "I love you!";
而对数组的初始化:
char str[14] = {"I love you!"};
不等价于
char str[14];
str = "I love you!";
4)如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址
char *a, str[10];
a = str;
scanf("%s", a);
先使a有确定值,即使a指向一个数组的首元素,然后输入一个字符串,把它存放在以该地址开始的若干单元中
5)指针变量的值是可以改变的,而数组名是常量
6)用指针变量指向一个格式字符串,可以用它代替printf函数的格式字符串
char * format;
fomat = "a = %d, b = %f
"
printf(format, a, b);
相当于
printf("a = %d, b = %f
", a, b);
因此只要改变printf所指向的字符串,就可以改变输入输出格式,这种printf函数称为可变格式输出函数
也可以用字符数组实现:
char format[];
format = "a = %d, b = %f
"

字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在
以该首地址为首的一块连续的内存空间中并以‘\0’
作为串的结束。字符数组是由于若干个数
组元素组成的,它可用来存放整个字符串
char
*p
=“C
language”;
char
p[]={"C
language"};
可以理解为:字符指针是字符数组的退化
但是实际使用中,字符串指针却比字符数组更好用

简述字符串数组和字符指针的区别,举例说明。
答:指针可以指向其他的值 而数组名定义出来之后就是锁定指向这个地址。在c语言中,字符串变量名字 就是一个被固定了方向的 指针!上网查一本叫做《c和指针》的书,你会对指针,数组所有迷惑都找到解答。美国人写的,四大经典c语言书之一,另外三本是《c programming language》《c专家编程》《c语言陷阱...

指向字符串的指针 和 字符数组的区别
答:指针就是内存单元的地址,通过这个地址就可以存取它所指向的数据。指针有指针常量和指针变量之分,指针常量就是一个具体的地址值,指向确定的某个内存数据;指针变量是用来存储指针值的存储单元,可以存储不同的值,以用来指向想让它指向的数据。数组是内存中的一片区域,用来存放一些相同类型的数据。数组...

1.字符串指针变量与字符数组都可实现字符串的存储和运算,所以两者没有...
答:【错误】字符串指针变量本身是一个变量,用于存放字符串的首地址。字符数组用来存放整个字符串。

指向字符串的指针 和 字符数组的区别
答:指针就是内存单元的地址,通过这个地址就可以存取它所指向的数据。指针有指针常量和指针变量之分,指针常量就是一个具体的地址值,指向确定的某个内存数据;指针变量是用来存储指针值的存储单元,可以存储不同的值,以用来指向想让它指向的数据。数组是内存中的一片区域,用来存放一些相同类型的数据。数组...

关于表单name为数组和字符串的区别,谁能解释下
答:用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:1.字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来...

C语言中字符变量和字符数组一样吗
答:字符变量是一个字符char 字符数组是一串字符。另外,数组在传递的时候,其实是传递一个字符指针,除非你强行拷贝所有数组成员——但是即便如此,你在拷贝操作时,仍然是按指针寻址的c[1] 就是 *(c + 1)补充:s[20]是数组。scanf的第二个参数需要指针,指向你要赋值的变量,也就是这个变量的地址。

从汇编语言的角度看清数组名和指针变量的区别
答:(3)用常量字符串初始化字符数组和指针变量 char a[]="hello";char *p="hello";1212 这两条语句似乎没啥区别,都是初始化了一个字符串。但是,经过上面的分析可以看出这两条语句的区别是很明显的。字符数组的初始化其实是定义了6个字节的内存空间, 然后把”hello”的每个字符依次放进去,a[0]...

c语言 字符数组 字符指针 sizeof strlen 的区别
答:简单概括,strlen()返回的是字符数组或者字符指针中的元素个数,sizeof返回的是字符数组中所有元素所占的总字节数,对于字符指针,返回的只是指针所占的字节数,32位系统上都是4字节。具体来说有如下几点区别:1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能...

字符数组名,无名字符串和字符指针有什么区别?
答:8.str=“string”是: 开始已经定义了一个char 指针str,且没指向任何地方。 该语句,把一个string字符串加上\0结束符存放在内存中,并且把该字符串的地址,也就是s的地址,即“string”给str,使str指向“string”所在的空间。9.ch=“string”是不对的。 ch是一个数组。数组名虽然也就是数组第...

C语言中字符数组和字符指针的问题
答:把char p[]="hello world"改成char *p="hello world"; 后,字符串"hello world"不是变量,而是一个常量,编译程序在处理这种常量时,通常把它放在了常量区中。而常量区则是始终存在的。所以返回首地址后,在外部还可以继续访问该常量,所以就能打印出来。函数返回指针,要使主程序可以使用这个指针来...