数组、字符串、指针的认识

1、C/C++中字符串都是以’\0’结尾的。稍不留神就会造成字符串越界,

  例如: char str[9];

      strcpy(str,”0123456789”);  //其内容长度是11,而你的数组定

  义长度只有10,在编程的时候,编译器不会报错,因为他不会检测你的长度

  (至少Keil是这样的),数组是单独划分的一个用户内存区;然而如果你用下

  面语句就会出问题了:

  

  

  

    while(str[i] == ‘\0‘);

  

  

  所以,一般在复制字符串时一定要为在字符串长度的基础上多申请一个字节内存给’\0‘

2、但是字符就是字符,不会自动给你加一个‘\0’的;

例如:  char str[2] = {‘a’,‘’b‘};

  

    这样子就只有只有两个元素,没有了’\0‘

3、字符串后面不能连接一个数组,而数组后面可以连接一个字符串;连接是指将连个内容

  连成一串,运用指针的思想,传递的是地址,而不是内容本身;

看看一下代码会输出什么:

  char str1[] = "Hello ZCM";

  char str2[] = "Hello ZCM";

  char *str3 = "Hello ZCM";

  char *str4 = "Hello ZCM";

  if (str1 == str2)

  {

       cout<<"str1 is same as str2\n";

   }

   else

  {

        cout<<"str1 is not same as str2\n";

  }

  if (str3 == str4)

  {

    cout<<"str3 is same as str4\n";

   }

   else

  {

  cout<<"str3 is not same as str4\n";

  }

  输出:

      

  C/C++把常量字符串放到单独的一个内存区,即文字常量区,我的其他文章会对C++的代码区段和性质作个总结,这里不熬述了。str1和str2是两个字符串数组,我们会为他分配10个字节的空间并把“Hello ZCM”复制进去。所以这是两个初始地址不同的数组。而str3和str4是两个指针,我们无需为它分配内存以存储字符串的内容,我们只需要把他指向“Hello ZCM”中的内存地址就行了。由于“Hello ZCM”是字符常量,他在内存中只有一个拷贝,因此str3和str4指向的是同一个地址;

  

  注意:部分代码为其他博客上看到的,加一自己的理解整理了一下,如有错误还望指正。

时间: 2024-10-07 22:26:27

数组、字符串、指针的认识的相关文章

结构体指针内存——指针数组——字符串指针内存申请

前几天用的结构体,结构体内还包含有结构体指针和数组以及指向字符串的指针,发现自己对这方面的东西还很容易犯错,故现在讲其中容易出错的地方写出来,分享给大家也方便自己日后查看. typedef struct { char name[50]; char job[50]; int age; int people_id; } peopleInfo; typedef struct { bool typeAdd; bool typeDel; int length; peopleInfo *info; char

字符 字符串 字符数组 字符串指针 指针数组

一.字符串指针.字符数组 1. 字符串指针:字符串指针变量本身是一个变量,用于存放字符串的首地址.而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以'\0'作为串的结束. char *ps="C Language"; 可以写为: char *ps;  #ps字符串指针,是指针,是一个变量, ps="C Language"; #ps为字符串的首地址,利用ps++可遍历字符串,字符串存储在以ps为开始地址的地段连续的内存空间中,并以'\0'作为字符串的结束.

C-二维数组, 字符串, 指针

常用的三种数组初始化: int arr[][4] = {{元素}, {元素},{元素},{元素}}; 二维数组本质: 每个元素是一维数组的特殊一维数组; 二维数组与函数: 1. 同一维数组一样, 当作为函数参数的时候, 函数的内部与数组对应的其实是一个指针 2. 所以在作为函数参数的时候, 需要同时传入行, 列 3. 在形参中的二维数组, 行数可以省略, 但是列数不能省略, 实参中对应的二维数组, 行数可以任意, 但是列数必须保持一致 void test(int rows, int cols,

字符串指针(char*)和字符数组(char [])区别

原文:http://www.blogbus.com/kavine-logs/29243638.html 今天在编写几个小函数的时候,半天调不通,长久不使用C++知识都快忘光了,赶紧拣些起来应付即将到来的应聘. void main(){    char* pStr1 = "Hello!";    char pStr2[] = "Hello!";    change(pStr1);    change(pStr2);}void change(char* pInstr){

C 字符串指针与字符数组的区别

用字符数组和字符指针变量都可实现字符串的存储和运算.但是两者是有区别的.在使用时应注意以下几个问题: 1. [字符串指针变量]本身是一个变量,用于存放字符串的首地址. 而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以'\0'作为串的结束. [字符数组]是由于若干个数组元素组成的,它可用来存放整个字符串. 2. 对字符串指针方式  char *ps="C Language"; 可以写为: char *ps;  ps="C Language"; 而对数组方式

第六章:数组、指针、与字符串

主要内容: 1.数组 2.指针 3.动态存储分配 4.指针与数组 5.指针与函数 6.字符串 内存地址: 1.内存地址的访问方式 通过变量名访问 通过地址访问 2.& var; //表示var在内存中的起始地址 void类型的指针就相当于一个hook(钩子),可以指向任何数据类型. 1.const 数据类型 * ptr //指向常量的指针 常量指针不可以改变所指对象的值,但是可以指向另外的对象(ptr本身可以改变). 2.数据类型 * const ptr //指针常量 指针本身不能改变,只能指向

指针 指针与数组 指针与字符串 指针与函数 结构体与指针 宏

指针 指针与数组 指针与字符串 指针与函数?? 指针与数组 1.数组名:数组元素首地址 eg: int array[3]={1,3,6}; 这里array 恒等于&array[0] 2.int *p = a; int *p = 0; int a[]={0}; 3.int *p = a; 均指向数组的首地址 *p是? *(p+1)是?(*p)+1是? *(p+1)决定向下移动几个字节是类型 4.指针可以当数组名使用 p[1] = 3; 恒等于a[1] ;恒等于*(p+1);恒等于*(a+1) 5.

字符串指针变量与字符数组的区别

使用字符串指针变量与字符数组的区别 (1)分配内存 设有定义字符型指针变量与字符数组的语句如下: char *pc ,str[100]; 则系统将为字符数组str分配100个字节的内存单元,用于存放100个字符.而系统只为指针变量pc分配4个存储单元,用于存放一个内存单元的地址.(2)初始化赋值含义 字符数组与字符指针变量的初始化赋值形式相同,但其含义不同.例如: char str[ ] ="I am a student ! " ,s[200]; char *pc="You

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

今天在看书上的一段代码的时候发现有一段代码有问题,对于那段代码的错误进行一下解释. 并加强一下我们常用的两种定义字符串的方法的一些区别进行一下解释. 书上的错误代码大概如下: #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

char型字符串(数组)与string型字符串 指针与引用

一.常指针: int *const p;    //指针不可改变,但是指针指向的数据可以改变. 指向常量的指针: const int *p;    //指针可以改变,但是指针指向的数据不可以改变. 指向常量的常指针: const int *const p;    //指针不可改变,且指针指向的数据也不可改变. 引用就是别名,定义引用的同时必须要对引用进行初始化. 二.利用引用返回多个值: 引用就是别名,引用必须要初始化. #include "stdafx.h" #include <