char* p与char p[]

char (*p)[]与char *p[] char p[] = "hello,world"; 是对字符串"hello,world"做了拷贝,所以可以对拷贝字符串做任意修改char *p = "hello,world"; 字符串常量将自己在静态存储区中的地址赋给了p指针char (*p)[SIZE]:指向一维数组的指针,一维数组只能有SIZE个元素例:#include #define STRSIZE 20int main(void){       char str[][STRSIZE]={"hello", "world!"};       char 阅读详情
C++内存的5个区:

(⊙v⊙)嗯,其实这5个区没啥好说的。但是为了之后要写的内容,先把这5个区简单说一下嘛。

栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

自由存储区:就是那些由malloc等分配的内存块,与和堆是十分相似的,不过它是用free来结束自己的生命的。

全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区

常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,一般是不允许修改的。

栈与堆

感谢

http://blog.chinaunix.net/uid-14825809-id-301187.html

对于堆,我们首先要知道操作系统有一个记录空闲内存地址的链表。当系统收到程序的需要分配内存的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后把该节点从空闲节点链表中删除,并将该节点的空间分配下去。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete语句才能正确的释放本内存空间。还有,由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲的链表中。所以频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片。

对于申请大小的限制。栈在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。也就是说栈顶的地址和栈的最大容量是系统预先规定好的(好像VS上面是1M样),如果申请的空间超过栈的剩余空间,将会提示overflow。而对于堆来说,堆是向高地址扩展的数据结构,是不连续的内存区域。我们之前说过我们是通过空闲内存地址的链表的帮助来分配内存的,所以自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。

还有,在函数调用时,第一个进栈的是主函数中函数调用语句的下一条指令的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右到左入栈,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数的下一条指令,程序由该点继续运行。

有趣的小例子

int main(){
  char* p="hello1";
  char a[]="hello2";
  p[2]='A';
  a[2]='A';
  return 0;
}

这个代码是有错的,p[2]=’A’错了。指针变量p和变量数组a都在栈区,”hello1”与”hello2”都是字符串常量在常量存储区,不过字符串常量”hello2”赋值给了一个局部变量(char []型数组)。字符串常量”hello2”在内存就有两份拷贝了,一个在动态分配的栈中,一个在常量存储区中。p[2]=’A’是对常量存储区中的字符串”hello1”进行修改,这肯定是不行的,而a[2]=’A’就可以了,它是对栈中的char型数组a进行修改。

再来一个例子

int main(){
   char* p="hello1";
   char a[]="hello2";
   p++;
   a++;
   return 0;
}

这个代码也是有错的。a++错了,a是一个数组名,相当于一个常量指针不能被修改。
我们再次强调一下:
p是指向字符串常量首地址的指针,内容为常量不可修改,指针可以修改;
a是指向数组的常量指针,指针不可修改,内容可修改。

再来一个例子

char *returnStr1()
{
    char *p="hello1";
    return p;
}
char *returnStr2()
{
    char p[]="hello2";
    return p;
}
int main()
{
    char *str1=NULL;
    str1=returnStr1();
    printf("%s\n", str1);

    char *str2=NULL;
    str2=returnStr2();
    printf("%s\n", str2);

    return 0;
}

“hello1”是字符串常量,被放在常量存储区,把该字符串常量存放在常量存储区的首地址赋给指针p,当returnStr1函数结束退出后,该字符串常量所在的内存不会被回收。而对于returnStr2函数中的局部变量char型数组p中存放的是字符串常量”hello2”赋值给的,这个是在动态分配的栈中,当returnStr2函数结束退出后,局部变量的内存被回收,这时候返回的地址是已经被释放的内存地址了。

IQA图像质量评价 数据集介绍(LIVE、TID2013、CSIQ、LIVEC、KonIQ-10K) LIVE、TID2013、CSIQ、LIVEC、KonIQ-10K 数据集介绍 阅读详情

相关推荐

C#调用Bartender打印标签,除了打印还能一键导出图片和PDF(附完整代码)

本文详细介绍了如何使用C#集成Bartender实现标签的多格式输出,包括打印、图片和PDF导出。通过完整的代码示例和实战技巧,帮助开发者解决分辨率适配、纸张尺寸控制等核心问题,提升工业自动化和物流管理中的标签处理效率。

weixin_31236101的博客 369

容易混淆的不同字符串的定义形式 char p[ ]和char * q有什么区别。烧脑指针练习之c语言三级指针,指针的运算和使用。

字符串的定义形式 char a[ ] = "abcdef"; //这种定义下,a是一个字符数组,数组里有7个元素 abcdef \0。 只有在&a 和单独放置在sizeof中时,代表的是整个数组的地址 ,除此之外,都代表数组首元素的地址。 char* p = "abcdef";//在这种定义下,系统会创建一个常量字符串(常量字符串,只能被访问,不能修改其中的数据。),而p中放置的是字符a的地址。这里要注意:这种定义方式下 p并不是一个数组。它只是一个装着常量字符串中首字符a的地址的..

qq_51004011的博客 1701

SAP-ABAP:SAP中如何查看系统表之间的关联关系?

在业务逻辑开发或者ALV开发过程中,我们通常要从系统中找出几个标准表之间的关联关系,有的是head与item,通过外键进行关联的关系。那么怎么去找到呢?以上就是具体如何产看系统表之间的关联关系的步骤,对于不同代码的业务顾问,也是必须要掌握的。

LinkStar的博客 2430

从内存层面看char *p和char p[]的区别

char p[]="hello": p[]是一个字符串数组,编译器在栈上给p[]分配6字节的空间,6字节中依次存储'h','e','l','l','o','\0'。 但不存在p指针本身的存储。p是一个数组内存块的名字。 字符串是可以修改的。 char *p="hello" : p是指向一个常量字符串的指针 ,编译器在栈上给p分配4字节(如果是32位),而字符串"hello"存放在静态存储区。 字符串是不能修改的。 下面的例子: #include<iostream> using...

马小超 747

Tessent MBIST SDC

主要是两个PROC,tessent_constrain_${design_name}_mentor_ijtag_non_modal和tessent_constrain_${design_name}_mentor_memory_bist_modal。其中,Memory/MBIST controller/MEM Interface可以从func_clk_1来(用func_clk_1和func_clk_2的高频时钟),如图中红色线。其中,SIB和BAP用ijtag_tck的clock,如图绿色线。

po_poo的博客 1988

AI对嵌入式的冲击分三波,大多数人只看到了第一波

摘要:AI对嵌入式行业的冲击将分三波递进:第一波(已发生)是代码生成,AI能完成底层驱动配置;第二波(1-2年内)是架构设计,AI将参与系统方案制定;第三波(2-3年)是需求验证,AI能穷举测试用例但无法替代安全决策。每波冲击都将重新定义工程师的价值标准,经验型工程师若不能将隐性知识转化为显性规则将面临淘汰。作者指出,完全不用AI的人第一波就会被淘汰,而仅满足于第一波应用的人将在后续冲击中落后。

u010898524的博客 961

指针—— char p[] 和 char *p

目录 1.char p[]和char *p ☆☆☆☆ 2. 3. 函数里的指针** 4.数组作为函数参数传递 5.两数交换的那些坑 6.函数参数为指针应小心 7. 数组指针 ** 8. 二级指针 9.*p++、 (*p)++、 *++p、 ++*p c语言-数组、指针面试题 - CYYZ古月 - 博客园☆☆☆☆☆☆ char *p="abc" 与 char p[]="abc" 的区别_安徽祝子的博客-优快云博客 C++ 常量 | 菜鸟教程 1.c...

Hi海底的博客 6970

银行统一监管报送系统

依据《银行业金融机构数据治理指引》,银行业金融机构应当建立适应监管数据报送工作需要的信息系统,实现流程控制的程序化,提高监管数据加工的自动化程度。银行业金融机构应当将监管数据纳入数据治理,建立工作机制和流程,确保监管数据报送工作有效组织开展,监管数据质量持续提升。银行通常要对接报送EAST5.0、1104、CRSS等近40个监管应用,涉及近1000张报表。表13-01是主要的监管报送应用、报送依据、报送规范、监管机构名称。

银行信息系统应用架构详解 4348

详解char* p及char p[]

char* p():声明一个函数返回值为一个指向字符(串)的指针。 #include <iostream> using namespace std; char* p() { static char str[100] = { "Hello World!!" }; return str; } void main() { char* str = nullptr; str =...

苦逼的程序猿 3万+

STM32实战开发(66):STM32图像处理开发教程

随着物联网、人工智能和嵌入式技术的不断发展,图像处理技术在嵌入式系统中的应用越来越广泛。图像处理不仅在视觉识别、安防监控、智能家居等领域中发挥着重要作用,也在工业自动化、医疗成像、无人驾驶等高科技领域中占据重要地位。而STM32凭借其强大的硬件性能和丰富的外设支持,成为了许多图像处理应用的理想平台。

2201_76125393的博客 1444

嵌入式开发环境Vscode开发STM32单片机程序

STM32单片机非常强大,大多数教程都是使用 keil 编译器,keil 是收费的而 gcc 是开源免费的。这里介绍一些使用 gcc +开发单片机程序的经验。(这里不解释 gcc 是什么)。

嵌入式技术开发 1843

char* p指针和char** p指针

转自https://blog.youkuaiyun.com/u014774853/article/details/52877655 char p是声明一个字符类型变量p,char * p1是声明一个字符类型的指针变量p1,那么char ** p2就相当与给char类型的指针变量再声明一个指针.(2级指针) 例如 char&nbsp;*p&nbsp;;//char&nbsp;指针&nbsp;,表示p里面寸一个c...

qq_41039802的博客 909

uniapp [微信小程序] - 详解微信小程序端接入mqtt全流程及示例源码教程,uniApp微信小程序端如何接入MQTT插件并实现连接/断开+发布订阅+消息队列+离线重连等各种示例代码(开箱即用)

uniapp微信小程序接入MQTT,uniapp中使用mqtt,uniapp 微信小程序端接入mqtt示例代码教程,适用于微信小程序的MQTT插件,uniapp开发微信小程序连接mqtt,uniApp微信小程序接入MQTT协议,uniapp vue3微信小程序使用MQTT的小例子接入流程,使用uniapp开发小程序接入mqtt,如何在uniapp项目中使用mqtt,uniapp mqtt的使用示例,mqtt连接报错,如何在项目里集成mqtt,Mqtt协议,主动连接mqtt,订阅消息,实现发布,订阅和接收消息

🏆 前端领域优质创作者 2881

const char *p,char const *p和char *const p区别(面试题常见)

请看下面三种定义: const char *p; char const *p; char * const p; 请问三者有什么区别? 先看第一种,先看p,根据优先级它和*结合,是指针,指向char类型,但是char前面有一个const修饰,所以p所指向的内容为const类型不可修改。      第二种:由于没有const *的运算,若出现const *的形式,则const实际上是修...

Lawrence_121 5万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深入理解const char*p,char const*p,char *const p,const char **p,char *const*p ...

一、可能的组合: (1)const char*p (2)char const*p (3)char *const p (4)const char **p (5)char const**p (6)char *const *p (7)char **const p 当然还有在(5)、(6)、(7)中再插入一个const的若干情况,不过分析了以上7中,其他的就可类推了! 二、理解助记法宝:...

Jeff_的博客 6745

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

char *p 和char *p[]

char *p 和char *p[]区别

fang92的专栏 837

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

char* p 和 char p[] 的区别

在最近的项目中频繁的使用char* p 和 char p[ 10 ],总是默认的以为他们相同,可是在用的过程中总是出现一些错误。在网上搜了下还是有许多的讲解,就整理下添加自己的一下想法。 char* p = "HelloWorld"; "HelloWorld"的类型是 const char*,编译器在编译的过程中会在静态数据区为"HelloWorld"分配空间存储这个字符串,然后将字符串的首地

流离年少,林夕十里 2464

char *const p,const char *p,char const *p和区别(容易混淆)

我在c++中学到了这个地方的时候,我们会碰到下列的这些定义. char *const p const char *p char const *p 如果学得不够深入的话,很难分清这些区别。 我们来看第一种char *const p 我们很容易能看到const 修饰的是p即p是不能被修改的。 所以p指向的内容是可以修改的,但是改变p是不可以的。 第二种是const char *p 我们可以看到const是修饰 指针p指向char类型,可以认为是p所指向的内容是不可以被修改的。 第三种就是char con

shenbossed的博客 1972

const char* p和char const* p和char *const p

和强调所指向内容的常量性,保护内容不被意外修改,常用于函数参数传递或指向常量字符串等场景。强调指针本身的常量性,指针一旦确定指向某个地址就不能更改,适用于需要固定指向某个特定内存区域且允许修改内容的情况。

m0_73695439的博客 647

char *p[4] 和 char (*p)[4]的区别

前提知识:指针占4个字节。指针存放的是地址指针加1,代表偏移一个指针类型的大小开始区分先说一下char a[4].                 a:数组中第一个元素的首地址 即:  a === &amp;a[0]                 a+1: 表示a偏移一个 指针类型(char)大小的地址,即  a+1   === &amp;a[1]      2. char *p[4]     ...

切掉的半个柠檬的加油站 1万+

char* const p,const char* p, char const* p 的区别

char* const p,const char* p, char const* p真的很容易让人弄混 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。 char * const p; ( * 读成 pointer to )p is a const pointer to char con

优快云_w2y的博客 861

const char *p,char const *p和char *const p区别

const char *p; 先看p,根据优先级它和*结合,是指针,指向char类型,但是char前面有一个const修饰, 所以p所指向的内容为const类型不可修改。 char const *p; 由于没有const *的运算(const不可能修饰*),若出现const *的形式,则const实际上是修饰前面的, 所以char const *p和const char *p一样。 char ...

qq_39014877的博客 596

关于char const **p、char * const *p、char ** const p的区别

一直对指针理解的不是很深,在复试也被提问这方面的问题回答凌乱十分尴尬,索性一次性好好理解一下指针和const结合的char const **p、char * const *p、char ** const p之间的区别。 理解思路 理解方法:将const当作函数,后面跟什么,什么就不变。 首先区别const char *p, char const *p,char * const p三者的区别: (1...

fs512466725的博客 1049

const char*p 、char * const p、char const *p

const char * p 和char const *p 表达的含义一致,即指向常量的指针(是个指针) 从上面的程序中可以看到,常量指针指向字符数组的第一个元素,为‘h’,随后,我们将字符数组的第一个元素更改为'K',然后输出*p可以看出此时常量指针仍然指向数组第一个元素,此时第一个元素为K。 从上面的程序中可以看出,当我们让常量指针指向另一个值时,会出现报错:不能给常指针量复制。 ...

zhang_zhilai的博客 1895

char* p与char p[]的不同

<br />基本问题,例如char* p="I Love you!",当我们试图通过p[i]进行改变时,编译会出错;但对于char p[]="I Love you!",当试图通过p[i]进行改变时,编译会顺利通过。为什么呢?接下来请看原因:<br />通过例程进行分析--<br />问题1:<br />#include "stdio.h"<br />char *getMemoryFirst()<br />{<br />    char p[] = "I Love you!";   //<br />    r

洋流丽丽 311

char *const p ,char const *p,const char *p的区别

char * const p; 常量指针,p的值不可以修改 char const * p; 指向常量的指针,指向的常量值不可以修改 const char *p ; 和char const *p相同

zq9955的博客 674
上一篇: 快速排序递归与非递归实现
下一篇: 用户级线程
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值