字符数组与字符指针

用字符数组和字符串指针都可实现字符串的存储和运算,但是两者是有区别的。

1) 字符数组是一个数组,每个元素的值都可以改变。而字符串指针指向的是一个常量字符串,它被存放在程序的静态数据区,一旦定义就不能改变。这是最重要的区别。

关于静态存储区的概念请查看:C语言内存模型(内存组织方式)

下面的代码在运行期间将会出错:

复制纯文本新窗口
  1. #include <stdio.h>
  2. int main(){
  3. char str1[] = "C Language";
  4. char *str2 = "C Language";
  5. str1[1] = ‘-‘;
  6. *(str2+1) = ‘-‘; //错!不能改变字符串常量的值
  7. printf("str1 = %s\n", str1);
  8. return 0;
  9. }
#include <stdio.h>

int main(){
    char str1[] = "C Language";
    char *str2 = "C Language";
    str1[1] = ‘-‘;
    *(str2+1) = ‘-‘;  //错!不能改变字符串常量的值
    printf("str1 = %s\n", str1);

    return 0;
}

2) 对字符串指针方式:

char *ps="C Language";

可以写为:

char *ps;
ps="C Language";

而对数组方式:

char st[]={"C Language"};

不能写为:

char st[20];
st={"C Language"};

只能对字符数组的各元素逐个赋值。

时间: 2024-10-01 04:51:33

字符数组与字符指针的相关文章

字符数组和字符串指针的定义

今天在看书上的一段代码的时候发现有一段代码有问题,对于那段代码的错误进行一下解释. 并加强一下我们常用的两种定义字符串的方法的一些区别进行一下解释. 书上的错误代码大概如下: #include<stdio.h> void copy(char *x,char *y) { for(;*y!='\0';x++,y++) *x=*y; *x='\0'; printf("%s\n",a); } int main() { char *a="Hello!"; char

内存的堆分配和栈分配 &amp; 字符数组,字符指针,Sizeof总结

堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻

字符数组、字符指针请不要再纠结

在C语言中字符数组.字符指针的一些特质感觉有点模糊,有些时候只知道要这样做却不知道为什么,过段时间就忘了,下次又得费时费力费钱的找答案,难受.OK,今天就好好琢磨琢磨~ 先来两个基本概念: 1.声明字符数组 int a[10]; 定义了一个长度为10的数组a.换句话说它定义了一个由10个对象组成的集合,这10个对象存储在相邻的内存区域中,名字分别为a[0].a[1]....如果pa的声明为 int *pa; 则说明它是一个指向整形对象的指针,那么赋值语句 pa = &a[0]; 则可以将指针pa

C语言中字符数组和字符串指针分析

这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这做个小总结,也算加深下自己的印象,写了下面的测试程序: #include <stdio.h> int main(int argc, char *argv[]){ char day[15] = "abcdefghijklmn";  char* strTmp = "opq

字符数组和字符指针的差别

字符数组是一个指针常量,而字符指针是一个指针变量.例如以下代码所看到的 char a[80]; a[80]="Hello";   //错误.仅仅能挨个元素进行赋值或者使用字符串函数strcpy(str1,str2) char *p; p="Hello";   //正确.由于是变量能够指定指向哪个字符串

字符数组与字符指针的区别与联系

1.字符指针可以指向一个字符串. 我们可以用字符串常量对字符指针进行初始化.例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化.此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址. 这里要注意字符指针与字符数组之间的区别.例如,有说明语句: char string[ ]="This is a string."; 此时,string是字符数组,它存放了一个字符串. 字符指针str与字符数组str

关于C中字符数组,字符指针以及C++中string类型的两两转换及排序

// practise.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <string.h> #include <string> #include <algorithm> #include <iostream> using namespace std; int main() { /* 字符串转字符数组,使用strncpy_s(),比strncpy()安全*/ string str

转:字符数组与字符指针

转自:http://blog.csdn.net/qiumm/article/details/5657120 1.字符指针可以指向一个字符串. 我们可以用字符串常量对字符指针进行初始化.例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化.此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址. 这里要注意字符指针与字符数组之间的区别.例如,有说明语句: char string[ ]="This is a st

字符数组与字符串指针

字符数组: 数组名是一个指针常量,不能直接赋值,即 char str[10]; str = "abcd"; 不能出现对数组名的自加或者自减,即str++, str--; 1 //字符数组(C风格字符串) 2 int main(){ 3 char str1[] = "abc"; 4 char str2[] = {'a', 'b', 'c'};//不以空字符结束,产生未定义行为 5 char str3[] = {"abc"}; 6 char str4