[转载]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[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也 ...
随机推荐
- mysql在生产环境下有大量锁表,又不允许重启的情况下的处理办法
mysql在生产环境下有大量锁表,又不允许重启的情况下的处理办法 满头大汗的宅鸟该怎么办呢? mysql -u root -e "show processlist"|grep -i ...
- 首页banner特效
<link href="css/swiper.min.css" rel="stylesheet" /> <script src=" ...
- 软件工程 speedsnail 冲刺3
2015-5-7 完成任务:环境崩溃,重新配置环境,学习了黑马android教学视频前6集: 遇到问题: 问题1 Error: Error parsing C:\Users\sam\.android\ ...
- 数据包判断是否丢包 ping+tracert+mtr
1.用咱们最常用的Ping命令来查看是不是真的丢包了 这里可以看到数据包发送了4个,返回了4个,丢失=0 证明没有丢失 也有可能中间路由做了策略不给ICMP的回应 这样就ping没法判断了 正常情 ...
- Asp.net页面跳转Session丢失问题
原本去年在做项目时,写好的一记篇博客分享给大家. Asp.net页面跳转Session丢失问题 编写人:CC阿爸 2014-4-2 l 近来在做泛微OA与公司自行开发的系统集成登录的问题.在使用 ...
- android 的通知管理
1在context里定义通知管理器(NotificationManager) NotificationManager notificationManager = (NotificationManage ...
- Google -We’re Sorry....
Author:KillerLegend From:http://www.cnblogs.com/killerlegend/p/3734840.html Date:2014.5.18 一大清早 一大早起 ...
- PHP 只有登陆后才能浏览的简单实现
1.============================================================= 在你不想让别人直接进入的网页开头加一段代码: session_start ...
- pure css做的pc登陆界面
源码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- 任务管理界面添加显示RAM信息
显示RAM信息的核心代码是大蛋的,我只不过是整理下教程而已! 大蛋应该不会介意的吧,首先你需要apktool和SystemUI.apk,framework-res.apk 然后开始加载框架和反编译.. ...