首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C 语言】字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符指针 | 指向堆内存指针 )

文章目录 一、字符串 一级指针 内存模型 1、指定大小字符数组 2、未指定大小字符数组 3、指向常量字符指针 4、指向堆内存指针 一、字符串 一级指针 内存模型 ---- #include <stdio.h..., 初始化 “123” 字符串 ; 全局区 常量区 中 , 存放 “123” 常量字符串 ; 栈区 array2 数组中 , 存放 “123” 字符串内容 , 注意最后 \0 字符..., 该数组大小 4 字节 ; // 栈内存数组 不指定大小 char array2[] = "123"; 3、指向常量字符指针 栈内存 中 , 定义 局部变量 指针 p ,...没有为该指针分配内存 , 该指针指向 字符串常量 “def” ; 全局区 常量区 中 , 定义 字符串常量 “def” ; // 定义指针 , 使用字符串赋值 char *p...= "def"; 4、指向堆内存指针 先在 堆内存 中 , 分配 5 字节内存 ; 然后 全局区 常量区 中 , 定义 字符串常量 “456” ; 最后 将 字符串常量 “456” 拷贝到 堆内存

2.4K20

指向字符指针赋值就出错?

现有一个指向字符指针, char *test ="123123123"; 如果执行下面这句话就会出错 *test=“321321”; 这是因为 test 这个指针指向是123123123这个储存于常量区字符串...通常说内存四区指就是上图中堆区、栈区、全局区和代码区这四个部分,全局区又可以分为全局变量区和常量区。 栈区包括局部变量、函数入参,返回值等。堆区是由程序员自行分配内存。...全局区用于存放全局变量、静态变量和常量,里面还有一个常量区,字符串常量和其他常量存放在此。该区域是程序结束后由操作系统释放。const定义全局变量存放在常量区(这个注意一下)。...代码区存函数体二进制代码。 为什么要划分这几个区呢,这是因为把不同数据放到不同区里,就赋予了这些变量或常量不同生命周期和不同释放方式,这样我们在编程中就可以根据需求灵活运用。...通过以上可以看出,上图中红色框内是不可以更改,开头那个字符串是存储常量区,是不可以更改。所以开头那个程序运行就会出错。

49930
您找到你想要的搜索结果了吗?
是的
没有找到

《挑战30天C++入门极限》CC++中字符指针数组及指向指针指针含义

C/C++中字符指针数组及指向指针指针含义   就指向指针指针,很早以前在说指针时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针指针。   ...char* *b=a;//定义一个指向指针指针,并赋予指针数组首地址所指向第一个字符地址也就是abc\0字符首地址 cout<<*b<<"|"<<*(b+1)<<...,定义以后a[]其实内部有三个内存位置,分别存储了abc\0,cde\0,fgh\0,三个字符起始地址,而这三个位置内存地址却不是这三个字符起始地址,在这个例子中a[]是存储栈空间内,而三个字符串却是存储静态内存空间内...const区域中,接下去我们看到了char* *b=a;这里是定义了一个指向指针指针,如果你写成char *b=a;那么是错误,因为编译器返回一个无法将char* *[3]转换给char *...答案是这样,c++中,输出字符指针就是输出字符串,程序自动遇到\0后停止.

1.3K20

C语言 | 用指向指针指针对5个字符串排序输出

例81:C语言实现用指向指针指针方法对5个字符串排序并输出。...解题思路:读者看着道题时候,首先要知道什么时指针指向指针指针应该怎么用,一般开发中不这样用,读者要看明白,这个很锻炼思维。...C语言源代码演示: #include//头文件  #include  #define LINEMAX 20 //定义字符最大长度  int main() {   ...定义整型变量    char **point,*pstr[5],str[5][LINEMAX];//定义变量    for(i=0;i<5;i++)   {     pstr[i]=str[i]; //将第i个字符首地址赋予指针数组...return 0;//主函数返回值为0  } void sort(char **point)//冒泡排序算法实现  {      int i,j;//定义整型变量    char *temp;//定义字符指针变量

1.4K53

【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向内存大小 )

自定义二级指针 , 接收字符串切割结果 ; 先分析出该 字符串中, 有多少个 逗号 字符 , 可以得到 二级指针 指向 内存空间中 , 要存储多少 一级指针 , 也就是分析出有多少 行 , 然后分析...= NULL) { // 将 p1 指针 与 p2 指针之间 字符拷贝出来 // 这就是分割后字符串 if (...= NULL) { // 将 p1 指针 与 p2 指针之间 字符拷贝出来 // 这就是分割后字符串 if (...p1 - p2 > 0) { // 计算精准控制 一级指针 指向内存大小 int len = p1 - p2...p1 - p2 > 0) { // 计算精准控制 一级指针 指向内存大小 int len = p1 - p2

1.9K10

手把手教你玩转常用字符串函数(包含模拟实现)

,再从参数观察,使用字符指针变量,并用const(常量)使其所指向地址值不可被修改。...,这样我们才能通过字符特性(字符串末尾有\0)来计算出字符长度,传递过去指针变量所指向内容是不需要修改,我们只计算长度。...char*也就是字符指针,是个地址,参数类型是两个字符指针,其中source这个字符指向内容不能被修改。...这些问题都想明白了,那么我们接下来就来说一下实现思路 我们已知两个字符首地址,那么我们就可以通过'\0'将两个字符串都遍历,我们这里只需要遍历完一个字符串就行,那就是实施覆盖字符串即可,我们只需要将这个字符串全部覆盖另一个字符串上...,这里可以通过'\0'来实现,实现完成后再在末尾地址上将另一个字符串覆盖上去即可,还是老样子,被拼接字符串要够长,不然越界。

9510

【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 操作一律创建新 指针变量 执行 | 引入 辅助 局部 指针变量 )

形参中 指针变量 , 具体操作是 函数中 定义 局部指针变量 ; 直接使用 *to_tmp++ 样式代码 , 会改变指针指向 , 有可能导致错误 , 一旦出错 , 根本无法排查 ; 如果 将...指针指向字符串 拷贝到 to 指针指向字符串换 */ void str_copy(char *from, char *to) { // 使用局部变量 接收 形参 char *from_tmp...{ // 这两个指针有任何一个为空 , 都直接退出 return; } // 从 from 指针指向字符 拷贝到 // to 指针指向字符...( 实现了模块化 ) * 将 from 指针指向字符串 拷贝到 to 指针指向字符串换 */ void str_copy(char *from, char *to) { //...指针指向字符 拷贝到 // to 指针指向字符 // 如果拷贝值不是 \0 , 则指针累加 // 如果拷贝值是 \0 // 这样就不需要额外拷贝 \0 字符

83610

【小Y学算法】⚡️每日LeetCode打卡⚡️——36. 验证回文串

C#方法:双指针 ????Java 方法一:筛选 + 判断 ????Java 方法二:字符串上直接双指针判断 ????总结 ????往期优质文章分享 ---- ????前言 ????...C#方法:双指针 思路解析 利用双指针,从字符串两头往中间遍历并进行比对,跳过非数字或字母项。...空间复杂度:O( |s| ),由于我们需要将所有的字母和数字字符存放在另一个字符串中,最坏情况下,新字符串sgood 与原字符串 s 完全相同,因此需要使用 O(∣s∣) 空间。 ????...Java 方法二:字符串上直接双指针判断 思路解析 直接在原字符串 s 上使用双指针移动任意一个指针时,需要不断地向另一指针方向移动,直到遇到一个字母或数字字符,或者两指针重合为止。...也就是说,我们每次将指针移到下一个字母字符或数字字符,再判断这两个指针指向字符是否相同。

51041

【小Y学算法】每日LeetCode打卡——36. 验证回文串

前言 原题样例:验证回文串 C#方法:双指针 Java 方法一:筛选 + 判断 Java 方法二:字符串上直接双指针判断 总结 前言 算法题 每天打卡一道算法题,既是一个学习过程,又是一个分享过程...s 由 ASCII 字符组成 C#方法:双指针 思路解析 利用双指针,从字符串两头往中间遍历并进行比对,跳过非数字或字母项。...空间复杂度:O( |s| ),由于我们需要将所有的字母和数字字符存放在另一个字符串中,最坏情况下,新字符串sgood 与原字符串 s 完全相同,因此需要使用 O(∣s∣) 空间。...Java 方法二:字符串上直接双指针判断 思路解析 直接在原字符串 s 上使用双指针移动任意一个指针时,需要不断地向另一指针方向移动,直到遇到一个字母或数字字符,或者两指针重合为止。...也就是说,我们每次将指针移到下一个字母字符或数字字符,再判断这两个指针指向字符是否相同。

29870

CC++中连接函数strcat应用(简单讲解)

答案是有的,C语言string.h库中有个神奇函数叫做strcat,它可以做到这一点。...类型指针,中文定义如下: char * strcat (目标字符串,源字符串);//将源字符副本附加到目标字符串上,目标字符串中终止空字符由源字符第一个字符覆盖,并将这两个字符串连接形成字符串...C中,函数原型存在 头文件中 参数定义 dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后字符串。...src -- 指向要追加字符串,该字符串不会覆盖目标字符串。...该函数将返回一个指向最终目标字符串 dest 指针 举个例子: #include #include int main() { char d[20]

1K20

面试之算法基础系列1.最多有k个不同字符最长子字符

文章目录 1.最长子字符串 1.最长子字符串 题目原为: 【题目】 给定一个字符串,给定一个数字k ( 0< k ≤ 字符串长度),输出最长包含k个不同字符子串长度。...虽然使用了生成器,但是性能方面还是有很大问题,同时未考虑特殊情况。...0或者k为0时直接返回0; 通过使用同向双指针方式,可以做到只遍历一次字符串就能得到答案,从而使时间复杂度为O(n),字符串上移动滑动窗口两个指针,来保证窗口内字符不超过k个,具体如下: 设置指针...left、right初始位置均为0,初始化计数数组; 当right小于字符串长度时,每次判断字符s[right]是否位于计数数组中,不在则计数count加1,同时对字典进行更新,并使right指针向右移动...; 字符数超过k时,需要移去窗口中最左侧字符string[left],同时向右移动left指针使得滑动窗口只包含k个不同字符; 更新最大长度res = max(res, right - left

50110

char *a 与char a[] 区别

char *a = “hello” 中a是指向第一个字符‘h’一个指针 char a[20] = “hello” 中数组名a也是执行数组第一个字符‘h’指针 *但二者并不相同:* 看实例...---- 把字符串加到指针所指串上去,出现段错误,本质原因:*d=”0123456789″存放在常量区,是无法修。而数组是存放在栈中,是可以修改。...通过指针只可以访问字符串常量,而不可以改变它。 而char a[20] = “abcd”; 此时 “abcd”存放在栈。可以通过指针去访问和修改数组内容。 二....栈上数组比指针指向字符串快。因此慢 而char a[20] = “abcd”; 存于栈上。...栈区:执行函数时,函数(包括main函数)内局部变量存储单元都可以栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中,效率很高,但是分配内存容量有限。

1.4K10

替换空格

看到这个题目,我们首先应该想到是原来一个空格字符,替换之后变成'%'、'2'和'0'这3个字符,因此字符串会变长。如果是原来字符串上做替换,那么就有可能覆盖修改在该字符串后面的内存。...如果是创建新字符串并在新字符串上做替换,那么我们可以自己分配足够多内存。       在这里介绍一种时间复杂度为O(n)解法。       ...我们从字符后面开始复制和替换。首先准备两个指针,P1和P2。P1指向原始字符末尾,而P2指向替换之后字符末尾(如图(a)所示)。...接下来我们向前移动指针P1,逐个把它指向字符复制到P2指向位置,直到碰到第一个空格为止。此时字符串包含如图(b)所示,灰色背景区域是做了字符拷贝(移动)区域。...此时P1和P2指向同一位置,表明所有空格都已经替换完毕。 ? 注:图中带有阴影区域表示被移动字符。(a)把第一个指针指向字符末尾,把第二个指针指向替换之后字符末尾。

2.8K60

Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间精妙变化

2.1 算法思想 下面使用长、短指针方案描述 BF 算法: 初始指针位置: 长指针指向原始字符第一个字符位置、短指针指向模式字符第一个字符位置。这里引入一个辅助指针概念,其实可以不用。...2.2 编码实现 使用辅助指针: # 原始字符串 src_str = "thismymyre" # 长指针 sub_str = "myr" # 长指针 :原始字符串上移动 long_index = 0...# 短指针模式字符串上移动 short_index = 0 # 辅助指针 fu_index = long_index # 原始字符串长度 str_len = len(src_str) # 模式字符长度...原始字符串和模式字符串齐头并进逐一比较时,最好不要修改长指针位置,否则,比较不成功情况下,则修正长指针逻辑就没有单纯直接向右移动那么好理解。...,长、短指针向右移动 # 如果长指针和短指针所在位置字符不相同时,这里 -1 就起到神奇作用,长指针可以前进,短指针变成 0 。

50510

【剑指Offer】19. 正则表达式匹配

和 ‘*’ 正则表达式。模式中字符 ‘.’ 表示任意一个字符,而 ‘*’ 表示它前面的字符可以出现任意次(包含 0 次)。 本题中,匹配是指字符所有字符匹配整个模式。...代码思路:   首先肯定是两个指针,一个在给定字符串上动,一个模板上动。如果匹配肯定都向后移动,但此时由于有两个特殊符号捣乱,因此比较特殊。   首先分析’.‘情况。...当我们比较两个指针字符时,模板字符是’.’,那么可以让两个指针同时后移。这个情况简单,就默认相等嘛。换句话说,本题只用考虑有没有’*'就可以了。 考虑’‘相关情况情况。...我们比较两个指针字符时,如果字符串是s指针,模板是P指针指向某个字符。那么P下一个字符不是’‘时,那么就是最普通情况,直接都往后移一位。即s++,p++。   ...方式1:出现了’’,而且s和p指向都不相等,就相当于模板中’‘前面的出现了0次,此时必须让p指针向后移动2位,让模板跳过’'即可。(对于abge和acmn,s指b,p指c,则让p指向m,即p+2。

22120

【数据结构】— kmp算法和strstr函数

原理分析 对比发现,strstr函数对整个母串和字串都进行了多次遍历,做了很多重复工作,浪费了一些我们已经知道信息,直接导致了时间消耗,大大降低了效率。...例如,一个长度为9t字符串abcdabcad,字串s为abca,当我们指针走到t[4]时候,发现匹配失败,此时s位置指针已经走到了s[3]位置,又得重新回到s[0],继续和t[4],进行匹配,...strstr代码如下: size_t Find(const char* str, size_t pos = 0) const //(两个指针,字串和父串从第一个开始字符匹配,如果第一个字符匹配后,...三、复杂度分析 时间复杂度是一个算法最为关键性质,那么一起看一下这两者时间复杂度对比,KMP串上指针,两种情况,要么配了头一个就不对,就往后走了,这时用O(1)排除了一个位置。...要么就是,配了n个位置以后配不对了,那不管next数组是多少,主串上指针总会向后走n个位置,所以每个位置还是O(1),这样看来,主串长度是len的话,时间复杂度就是O(len)啊。

49220

字符串:反转个字符串还有这个用处?

题目:剑指Offer58-II.左旋转字符字符左旋转操作是把字符串前面的若干个字符转移到字符尾部。请定义一个函数实现字符串左旋转操作功能。...具体步骤为: 反转区间为前n子串 反转区间为n到末尾子串 反转整个字符串 「最后就可以得到左旋n目的,而不用定义新字符串,完全串上操作。」...总结 此时我们已经反转好多次字符串了,来一起回顾一下吧。 在这篇文章字符串:这道题目,使用库函数一行代码搞定,第一次讲到反转一个字符串应该怎么做,使用了双指针法。 然后发现字符串:简单反转还不够!...,这里开始给反转加上了一些条件,当需要固定规律一段一段去处理字符时候,要想想在在for循环表达式上做做文章。 后来字符串:花式反转还不够!...好了,反转字符串一共就介绍到这里,相信大家此时对反转字符常见操作已经很了解了。 留言区留下你思路吧!

68920

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券