char *a 和char a[] 的区别(指针和数组的区别)

简介:

在C/C++中,指针和数组在很多地方可以互换使用,这使得我们产生一种错觉,感觉数组和指针两者是完全等价的,事实上数组和指针是有很大的区别的。

1.两者在含义上的区别。

   数组对应着一块内存区域,而指针是指向一块内存区域。其地址和容量在生命期里不会改变,只有数组的内容可以改变;而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。

如:

复制代码
#include < stdio.h >
#include
< stdlib.h >
#include
< string .h >

int  main( void )
{
 
char * s1 = " 123456789 " ;
char * s2 = " 123456 " ;
strncpy(s1,s2,
6 );
printf(
" %s %s\n " ,s1,s2);
return 0 ;
}
复制代码

在编译时不会报错,但是在运行时会报错,原因在于企图改变s1的内容,由于s1,s2指向的是常量字符串,其内容是不可修改的,因此在运行时不会通过。而下面这个程序是可以运行通过的:

复制代码
#include < stdio.h >
#include
< stdlib.h >
#include
< string .h >

int  main( void )
{
char  s1[ 10 ] = " 123456789 " ;
 
char  s2[ 10 ] = " 123456 " ;
strncpy(s1,s2,
6 );
printf(
" %s %s\n " ,s1,s2);
return 0 ;
}
复制代码

 

在VC++ 6.0上可以编译运行通过,原因在于数组的内容是可以被修改的,这就充分体现了指针和数组的区别,并不是完全等价的。

2.计算内存容量的区别。

    用运算符sizeof可以计算出数组的容量(字节数),而用sizeof却无法计算指针所指内存的容量,用sizeof(p)得到的结果永远是4或者2(即指针变量所占内存单元的字节数,一般情况下指针变量占2个或4个字节的内存单元)。在进行参数传递时,数组会自动退化为同类型的指针。

看下面这段代码和运行结果:

 

复制代码
#include < stdio.h >
#include
< stdlib.h >
#include
< string .h >

void  function( int  a[])
{
printf(
" %d\n " , sizeof (a));
}

int  main( void )
{
int  a[ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 };
int * p = a;
printf(
" %d %d\n " , sizeof (a), sizeof (p));
function(a);
return 0 ;
}
复制代码

运行结果为:

40 4

4


本文转载自海 子博客园博客,原文链接:http://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004808.html如需转载自行联系原作者


相关文章
|
1月前
|
C语言
指向结构体数组的指针
指向结构体数组的指针
13 2
|
1月前
|
存储 算法 C语言
通过指针引用数组元素
通过指针引用数组元素
20 0
|
1月前
|
C语言 C++
数组元素的指针
数组元素的指针
10 0
|
1月前
|
存储 C++
使用字符指针变量和字符数组的比较
使用字符指针变量和字符数组的比较
10 0
|
1天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
13 1
|
1天前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
10 0
|
14天前
|
存储 数据库
5. CHAR和VARCHAR的区别?
`CHAR`和`VARCHAR`在数据库中有所不同:`CHAR`长度固定,用空格填充,存储效率高,英文占1字节,汉字占2字节;而`VARCHAR`长度可变,节省空间,英文和汉字都占2字节。
14 0
|
29天前
|
存储 程序员 C++
指针数组和多重指针
指针数组和多重指针
17 2
|
29天前
|
存储 程序员 C++
使用字符指针变量和字符数组的比较
使用字符指针变量和字符数组的比较
14 1
|
29天前
|
存储 安全 Java
防止数组元素的指针被修改
防止数组元素的指针被修改
14 1