前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C/CPP数组的深入理解 | 指针与数组 | 一二三维数组

C/CPP数组的深入理解 | 指针与数组 | 一二三维数组

作者头像
CtrlX
发布2022-10-04 17:10:42
6670
发布2022-10-04 17:10:42
举报
文章被收录于专栏:C++核心编程C++核心编程

整型数组和字符型数组

数组是一段连续的内存,除了定义数组变量,也会用指针来表示数组,但是数组和指针不是完全相同的,数组有很多特性,例如数组有确定数量的元素,而指针只是一个标量值。

编译器用数组名来记住这些属性,只有当数组名在表达式中使用时,编译器才会认为它产生一个指针常量(不是指针变量,数组名的值是指针常量,详见C和指针P142)。

image
image
image
image

PS:注意数组的[]中的数字本质上是偏移量

代码语言:javascript
复制

数组与指针

数组与指针的关系

image
image
image-20221001181406925
image-20221001181406925

因此函数以数组作为参数时传入的都是数组的首地址,将首地址存放在一个临时的指针变量里。

代码语言:javascript
复制
//例如
void func(int *arr){}

作为函数参数时的规范:通常为了防止数组越界还会增加一个参数来表示数组长度。越界的危害见堆栈隐患文章(数组越界可能会导致函数的地址被篡改)

代码语言:javascript
复制
//规范写法
void func(int *arr,int length){}

用指针定义字符串和用数组定义字符串的方法和区别汇总(关键)

字符串的两种定义方式

代码语言:javascript
复制
#include<stdio.h>
int main()
{
    char *char1 = "helloworld";//指针的方式定义,注意这种定义方式在vs中报错
    char char2[11] = "helloworld";//数组的方式定义
    return 0;
}

PS:易错点,helloworld这十个字符能否放到char char2[10]中?显然不能,勿忘字符串的结尾符号\0也占一个位置。

区别

1.字符串的构造方式不同

char *char1 = "helloworld"是用char1这个指针指向这个字符串。这个helloworld存放在字符串常量区

char char2[11] = "helloworld";是在内存里创建了一块空间,把常量区的helloworld拷贝并存放到这块内存中。

2.字符串单个元素的修改情况不同

代码语言:javascript
复制
#include<stdio.h>
int main()
{
    char *char1 = "helloworld";//指针的方式定义
    char char2[11] = "helloworld";//数组的方式定义
    
    //修改元素
    *char1[0] = 'h';//报错,字符串常量不可以修改!
    char2[0] = 'h';//正常运行
    
    return 0;
}

要操作字符串,只能把它用数组方式,引入存放变量的区,才能操作,在常量区不能对字符串常量进行修改操作。

代码语言:javascript
复制
#include<stdio.h>
int main()
{
    
    char char2[11] = "helloworld";//数组的方式定义
    char *char1 = char2;//指针的方式定义
    
    //修改元素
    *char1[0] = 'h';//可以修改,正常运行
    char2[0] = 'h';//正常运行
    
    return 0;
}

3.字符串总体修改情况不同

代码语言:javascript
复制
#include<stdio.h>
int main()
{
    char *char1 = "helloworld";//指针的方式定义
    char char2[11] = "helloworld";//数组的方式定义
    
    //修改元素
    *char1 = 'abcde';//正常运行
    char2 = 'abcde';//报错
    
    return 0;
}

用指针定义的字符串可以整体进行修改,因为其只是将指向的常量地址进行更改,指向了另一个字符串,常量区出现在程序编译前。

C/CPP标准都规定了:只有标量和结构体,才能出现在赋值操作符=的左侧,但是数组类型并不是一个标量,因此不能对数组执行赋值操作。

一维二维三维数组

我们习惯的认为的1D,2D,3D数组的样子:

image
image

但是计算机中数组的实际样子:

image
image

这三个函数分别是给一维二维三维数组赋值,但是他们的汇编指令显然完全相同,因此无论数组是一维的还是高维的,他们都是一段连续的一维内存。

image-20221001182932854
image-20221001182932854
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 整型数组和字符型数组
  • 数组与指针
    • 数组与指针的关系
      • 用指针定义字符串和用数组定义字符串的方法和区别汇总(关键)
        • 字符串的两种定义方式
        • 区别
    • 一维二维三维数组
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档