[转载]char * 和char []的区别---之第二篇
原文地址:http://blog.sina.com.cn/s/blog_74a4593801019keb.html
main() 
{      
char *p="abc123ABC";//char p[]="abc123ABC"      
int i=0;      
while(*(p+i)!='\0')      
{      
if(*(p+i)>=97 && *(p+i)<=122)      
{      
*(p+i)=*(p+i)-32;      
}      
else if(*(p+i)>=65 && *(p+i)<=90)      
{      
*(p+i)=*(p+i)+32;      
}      
else      
*(p+i)=*(p+i);      
i++;      
}      
printf("%s\n",p);      
}      
为什么出错,改成char p[]="abc123ABC"为什么就对了????
//////////////////////////////////////////
char* p是一个指针,根本没分配内存,他指向的"abc123ABC" 是只读的,不能改变,你在下面给他赋值肯定是错的.而char p[]是一个数组,已经分配内存,是将"abc123ABC" 复制到该内存里面,这个内存是可读写的
指针是不分配内存的,它指向的是系统的只读的内存,而数组是分配内存的,就是将系统的只读的内存里面的值复制到它的内存里面,因此可读写
char* p是定义的一个指针。。他指向的字符窜"abc123ABC" 是存在不可修改的区域(代码区)的。。     
而char p[]是一个数组。。他的内容存在栈区可以修改
char p[]="abc123ABC";     
该条语句执行的是字符串数组的赋值操作是正确的      
char *p="abc123ABC";      
字符指针变量p指向字符串常量"abc123ABC"的首地址      
字符串常量存放在数据区的“常量段”      
所以当你访问并修改时会内存出错      
正确的操作应该是:      
char * p = (char * )malloc(10);      
strcpy(p, "abc123ABC");
//////////////////////////////////////////////////////
////////////////////////////////////////////////////////
在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
[转载]char * 和char []的区别---之第二篇的更多相关文章
- 转载:eclipse 搭建SSH项目(第二篇,有具体的项目例子)
		
原文地址:http://blog.csdn.net/yeohcooller/article/details/9316923 读博文前应该注意: 本文提纲:本文通过一个用户注册的实例讲解SSH的整合.创 ...
 - [转载]char *  和char []的区别---之第一篇
		
char * 和char []的区别---之第一篇 原文地址http://blog.csdn.net/yahohi/article/details/7427724 在C/C++中,指针和数组在很多地 ...
 - <转载>深入 理解char * ,char ** ,char a[ ] ,char *a[] 的区别
		
C语言中由于指针的灵活性,导致指针能代替数组使用,或者混合使用,这些导致了许多指针和数组的迷惑,因此,刻意再次深入探究了指针和数组这玩意儿,其他类型的数组比较简单,容易混淆的是字符数组和字符指针这两个 ...
 - C/C++中char* 与char []定义的区别
		
转载请注明来自souldak,微博:@evagle Question: 给你一个字符串例如abb输出它包含的字符的所有可能排列. 例如abb输出3个:abb,bab,bba Answer: 假设我们自 ...
 - [转载]MySQL之char、varchar和text的设计
		
[转载]MySQL之char.varchar和text的设计 来源:https://www.cnblogs.com/billyxp/p/3548540.html 首先我们先普及一下常识: 1.char ...
 - char* 和char[]的区别
		
以下内容均来自互联网,系笔者汇总并总结. 1. 问题介绍 问题引入:在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="ab ...
 - char *s="string"和char s[]="string"的区别
		
char *s="string"的内容是不可以改的 void main() { char* pStr1 = "Hello!"; char pSt ...
 - C语言scanf与get char,gets的区别
		
C语言scanf与get char,gets的区别 1.scanf() scanf是C语言的格式输入函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并 ...
 - char* 与char[]区别
		
[转] 最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也 ...
 
随机推荐
- 移植u-boot.2012.04.01
			
/*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...
 - 一个简单且丑陋的js切换背景图片基础示例
			
不多说,直接上代码,非常基础的一个原生js切换元素背景图片范例 <html> <head> <meta http-equiv="Content-Type&quo ...
 - JS焦点图 上下翻动 支持IE6
			
<div class="slider"> <ul class="num" id="homePushName"> &l ...
 - asp.net实现md5加密方法详解
			
MD5加密简单的说就是把一段明文 通过某种运算方式 求出密文. 例如:明文为:abcdefg 通过一些列运算 得到 密文 7ac66c0f148de9519b8bd264312c4d64 它具有两个特 ...
 - (转)C#与Java的证书密钥转换
			
前言 最近由于项目需求,服务端由c#编写,客户端由java编写.通信数据使用RSA非对称加密.但是java和c#生成的密钥格式是不一样的,所以需要转换格式才可以正常使用.网上搜到使用java进行格式转 ...
 - Windows API 的数据类型与 Delphi 数据类型对照表
			
Windows 数据类型 Delphi 数据类型 描述 LPSTR PAnsiChar 字符串指针 LPCSTR PAnsiChar 字符串指针 DWORD LongWord 整数 BOOL Long ...
 - hudson项目中的运用
			
项目中持续集成管理一直是用的hudson,最近的话,hudson遇到不少问题,因为之前对这个也不是很熟悉,所以也花了比较多的时间去解决,现在刚好也可以总结下自己学习到的hudson知识. 首先在我看来 ...
 - Flask —— 使用Python和OpenShift进行即时Web开发
			
最近Packtpub找到了我,让我给他们新出版的关于Flask的书写书评.Flask是一个很流行的Python框架.那本书是Ron DuPlain写的<Flask 即时Web开发>.我决定 ...
 - 完全面向于初学者的Node.js指南
			
新的上班时间是周二至周六,工作之余当然要坚持学习啦. 希望这篇文章能解决你这样一个问题:“我现在已经下载好Node.Js了,该做些什么呢?” 原文URL:http://blog.modulus.io/ ...
 - 【WPF学习日记】——Window的DataContext绑定ViewModel
			
1.全局的ViewModel绑定: a)设定全局的ViewModel(App.xaml中): 1 <Application x:Class="MyTest.App" 2 xm ...