第四章:指针与字符串

字符串就是字符序列。它存储的是字节数组。一个特殊字符串结束符是用来标记字符串的结束。结束符用转义序列‘\0’表示。

定义字符串变量的方法

char *strptr = "Hello";
char strarray1[] ="Hello";
char strarray2[6] ="Hello";
char strarray3[4]= { 'a ', 'b ', 'c', 'd'};
printf("%s\n",strptr);//Hello
printf("%s\n",strarray1);//Hello
printf("%c\n",strarray2[4]);//o
printf("%c\n",strarray2[5]);//空白

仔细研究一下下面的结果吧

char strarray2[6] ="Hello1";
printf("%c\n",strarray2[4]);//o
printf("%c\n",strarray2[5]);//l
printf("%c\n",strarray2[6]);//H
printf("%c\n",strarray2[7]);//e

4.1内存中的字符串排列

通常情况下,字符串或者字符数组存储在连续的内存单元中


访问字符串元素

数组索引和指针运算都可以用来访问字符串元素

char*str="Hello pointer";
for(int i=0;i<strlen(str);i++)
{printf("%c  ",str[i]);
}
return 0;
}

在上述代码中,利用数组索引访问字符串中的字符。函数strlen(char*)用来返回字符串的长度。返回的长度不包括所有字符串中必有的最后一个空字符。

下面的代码使用临时字符指针变量char* ptr遍历整个字符串。该实例演示如何使用指针访问字符串的每个字符。

char*str="YOU ARE A DOG";
char*pointer=str;while(*pointer!='\0')
{printf("%c  ",*pointer) ;pointer++;
}

printf("%d",sizeof(str));//4,说明str就是一个指针变量

4.2 动态分配内存

注意:数组中分配内存给媳妇序列存储字符串时需要一个额外的空字符标记字符串的结尾

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
int main(int argc,char* argv[])
{char* src = "Hello Pointer";
char* dst= NULL;
dst =( char*)malloc(sizeof(char)* (strlen(src) + 1));
memcpy(dst,src,strlen(src));for(int i=0;i<strlen(src);i++)
{printf("%c ",dst[i]);
}
return 0;
}

字符串文本和常量

定义字符串时编译器自动在字符串结尾增加转义字符‘\0’。某些文献中字符串常量也叫作字符串文本。最有趣的事是从RO扇区分配内存给字符串常量。RO扇区是存储字符串文本和常量的只读数据区。存储在该区域的数据的生命周期为程序运行的整个生命周期,这也是存储在该区域的数据变量的生命期。

#include <stdio.h>
char* foo(void);
int main(int argc,char* argv[]){char *m = foo();
printf("Printing local value of function foo = %s\n",m);
return 0;
}
char* foo(void){char* str = "STRING";return str;
}

该程序始终打印“STRING”。虽然变量的 char * str为函数foo()的局部变量,但它在所有范围内均能被访问。如前所述,变量char* str是一个字符串文本或常量,它的内存是从RO扇区分配的,所以在程序运行的整个生命周期中都有效。
自然常量化为字符串文本的另一个重要特性。一旦字符串文本被初始化其值就不能在后面的阶段修改。字符串文本相当于const char*变量名,其中指针可被修改,但所指的值不能修改。

#include <stdio.h>
int main()
{char *strliteral = "ADD" ;
printf("%c",strliteral[0]);
strliteral[0]= 'B';//修改第0个索引的值,不允许,//程序会产生分段错误
printf("%c",strliteral[0]);
strliteral++ ;//Allowed
return 0;
}

4.3 字符串操作

  • scanf()函数中的“%s”是将输入字符串存储到变量的格式。
  • 遍历字符串变量的每个索引是进行读数据或操作数据的最基本过程
  • 字符串复制是将字符串变量所指向的某个内存位置的存储数据复制到另一个内存单元所指向的内存位置的操作。

4.4 字符串数组

字符串数组的元素是指向字符数组或字符串数组的指针。数组存储的每个字符串可以是不同长度。

字符串数组的声明

char str[6][7];

第五章 指针与多维数组

5.1数组排列

5.1.1 二维数组指针

对于二维数组
定义:intarr[][]
arr表示第一个元素的地址,也是第0行的起始地址
arr[0]+1;表示第一行第二个元素的地址


#include <iostream>using namespace std;int main()
{int arr[5][5];for (int i=0;i<5;i++){for (int j=0;j<5;j++){arr[i][j]=i*i+j*j;}}cout <<"数组元素" << endl;for (int i=0;i<5;i++){for (int j=0;j<5;j++){cout<<arr[i][j]<<"\t";}cout<<endl;}cout <<"数组首地址" <<arr << endl;for(int i=0;i<5;i++){cout<<"*******i="<<i<<"*******"<<endl;cout << "arr+i\t"<<arr+i << endl;cout <<  "arr[i]\t" <<arr[i] << endl;cout <<  "*arr[i]\t" <<*arr[i] << endl;cout <<  "&arr[i]\t" <<&arr[i] << endl;cout<<endl;for(int j=0;j<5;j++){cout<<"*******i="<<i<<"*******"<<"j="<<j<<"\t"<<"arr[i]+j:\t"<<arr[i]+j<<"\t*(arr[i]+j)\t"<<*(arr[i]+j)<<endl;// cout<<"*******i="<<i<<"*******"<<"j="<<j<<"\t"<<"*arr[i]+j\t"<<*arr[i]+j<<endl;//cout<<arr[i]+j<<endl;}}cout<< endl;cout <<"数组指针访问数组"  << endl;int (*ptr)[5];//不能用 int*ptr[5]// int*ptr[5];ptr=arr;for(int i=0;i<5;i++){    cout<<"*******i="<<i<<"*******"<<endl;for(int j=0;j<5;j++){cout<<"*******i="<<i<<"*******"<<"j="<<j<<"\t"<<"*ptr+j:\t"<<*ptr+j<<"\t*(*ptr+j)\t"<<*(*ptr+j)<<endl;}cout<<*ptr++<<endl;}return 0;
}
数组元素
0       1       4       9       16
1       2       5       10      17
4       5       8       13      20
9       10      13      18      25
16      17      20      25      32
数组首地址0x6dfe58
*******i=0*******
arr+i   0x6dfe58
arr[i]  0x6dfe58
*arr[i] 0
&arr[i] 0x6dfe58*******i=0*******j=0    arr[i]+j:       0x6dfe58        *(arr[i]+j)     0
*******i=0*******j=1    arr[i]+j:       0x6dfe5c        *(arr[i]+j)     1
*******i=0*******j=2    arr[i]+j:       0x6dfe60        *(arr[i]+j)     4
*******i=0*******j=3    arr[i]+j:       0x6dfe64        *(arr[i]+j)     9
*******i=0*******j=4    arr[i]+j:       0x6dfe68        *(arr[i]+j)     16
*******i=1*******
arr+i   0x6dfe6c
arr[i]  0x6dfe6c
*arr[i] 1
&arr[i] 0x6dfe6c*******i=1*******j=0    arr[i]+j:       0x6dfe6c        *(arr[i]+j)     1
*******i=1*******j=1    arr[i]+j:       0x6dfe70        *(arr[i]+j)     2
*******i=1*******j=2    arr[i]+j:       0x6dfe74        *(arr[i]+j)     5
*******i=1*******j=3    arr[i]+j:       0x6dfe78        *(arr[i]+j)     10
*******i=1*******j=4    arr[i]+j:       0x6dfe7c        *(arr[i]+j)     17
*******i=2*******
arr+i   0x6dfe80
arr[i]  0x6dfe80
*arr[i] 4
&arr[i] 0x6dfe80*******i=2*******j=0    arr[i]+j:       0x6dfe80        *(arr[i]+j)     4
*******i=2*******j=1    arr[i]+j:       0x6dfe84        *(arr[i]+j)     5
*******i=2*******j=2    arr[i]+j:       0x6dfe88        *(arr[i]+j)     8
*******i=2*******j=3    arr[i]+j:       0x6dfe8c        *(arr[i]+j)     13
*******i=2*******j=4    arr[i]+j:       0x6dfe90        *(arr[i]+j)     20
*******i=3*******
arr+i   0x6dfe94
arr[i]  0x6dfe94
*arr[i] 9
&arr[i] 0x6dfe94*******i=3*******j=0    arr[i]+j:       0x6dfe94        *(arr[i]+j)     9
*******i=3*******j=1    arr[i]+j:       0x6dfe98        *(arr[i]+j)     10
*******i=3*******j=2    arr[i]+j:       0x6dfe9c        *(arr[i]+j)     13
*******i=3*******j=3    arr[i]+j:       0x6dfea0        *(arr[i]+j)     18
*******i=3*******j=4    arr[i]+j:       0x6dfea4        *(arr[i]+j)     25
*******i=4*******
arr+i   0x6dfea8
arr[i]  0x6dfea8
*arr[i] 16
&arr[i] 0x6dfea8*******i=4*******j=0    arr[i]+j:       0x6dfea8        *(arr[i]+j)     16
*******i=4*******j=1    arr[i]+j:       0x6dfeac        *(arr[i]+j)     17
*******i=4*******j=2    arr[i]+j:       0x6dfeb0        *(arr[i]+j)     20
*******i=4*******j=3    arr[i]+j:       0x6dfeb4        *(arr[i]+j)     25
*******i=4*******j=4    arr[i]+j:       0x6dfeb8        *(arr[i]+j)     32指针数组访问数组
*******i=0*******
*******i=0*******j=0    *ptr+j: 0x6dfe58        *(*ptr+j)       0
*******i=0*******j=1    *ptr+j: 0x6dfe5c        *(*ptr+j)       1
*******i=0*******j=2    *ptr+j: 0x6dfe60        *(*ptr+j)       4
*******i=0*******j=3    *ptr+j: 0x6dfe64        *(*ptr+j)       9
*******i=0*******j=4    *ptr+j: 0x6dfe68        *(*ptr+j)       16
0x6dfe58
*******i=1*******
*******i=1*******j=0    *ptr+j: 0x6dfe6c        *(*ptr+j)       1
*******i=1*******j=1    *ptr+j: 0x6dfe70        *(*ptr+j)       2
*******i=1*******j=2    *ptr+j: 0x6dfe74        *(*ptr+j)       5
*******i=1*******j=3    *ptr+j: 0x6dfe78        *(*ptr+j)       10
*******i=1*******j=4    *ptr+j: 0x6dfe7c        *(*ptr+j)       17
0x6dfe6c
*******i=2*******
*******i=2*******j=0    *ptr+j: 0x6dfe80        *(*ptr+j)       4
*******i=2*******j=1    *ptr+j: 0x6dfe84        *(*ptr+j)       5
*******i=2*******j=2    *ptr+j: 0x6dfe88        *(*ptr+j)       8
*******i=2*******j=3    *ptr+j: 0x6dfe8c        *(*ptr+j)       13
*******i=2*******j=4    *ptr+j: 0x6dfe90        *(*ptr+j)       20
0x6dfe80
*******i=3*******
*******i=3*******j=0    *ptr+j: 0x6dfe94        *(*ptr+j)       9
*******i=3*******j=1    *ptr+j: 0x6dfe98        *(*ptr+j)       10
*******i=3*******j=2    *ptr+j: 0x6dfe9c        *(*ptr+j)       13
*******i=3*******j=3    *ptr+j: 0x6dfea0        *(*ptr+j)       18
*******i=3*******j=4    *ptr+j: 0x6dfea4        *(*ptr+j)       25
0x6dfe94
*******i=4*******
*******i=4*******j=0    *ptr+j: 0x6dfea8        *(*ptr+j)       16
*******i=4*******j=1    *ptr+j: 0x6dfeac        *(*ptr+j)       17
*******i=4*******j=2    *ptr+j: 0x6dfeb0        *(*ptr+j)       20
*******i=4*******j=3    *ptr+j: 0x6dfeb4        *(*ptr+j)       25
*******i=4*******j=4    *ptr+j: 0x6dfeb8        *(*ptr+j)       32
0x6dfea8

通过指针变量访问二维数组的索引

 int (*ptr_1)[5];int *dataptr;ptr_1=arr;for(int i=0;i<5;i++){    cout<<"*******i="<<i<<"*******"<<endl;dataptr=(*ptr_1+i*5);for(int j=0;j<5;j++){cout<<"*******i="<<i<<"*******"<<"j="<<j<<"\t"<<"dataptr:\t"<<dataptr<<"\t(*dataptr)\t"<<*(dataptr)<<endl;dataptr++;}}
*******i=0*******
*******i=0*******j=0    dataptr:        0x6dfe4c        (*dataptr)      0
*******i=0*******j=1    dataptr:        0x6dfe50        (*dataptr)      1
*******i=0*******j=2    dataptr:        0x6dfe54        (*dataptr)      4
*******i=0*******j=3    dataptr:        0x6dfe58        (*dataptr)      9
*******i=0*******j=4    dataptr:        0x6dfe5c        (*dataptr)      16
*******i=1*******
*******i=1*******j=0    dataptr:        0x6dfe60        (*dataptr)      1
*******i=1*******j=1    dataptr:        0x6dfe64        (*dataptr)      2
*******i=1*******j=2    dataptr:        0x6dfe68        (*dataptr)      5
*******i=1*******j=3    dataptr:        0x6dfe6c        (*dataptr)      10
*******i=1*******j=4    dataptr:        0x6dfe70        (*dataptr)      17
*******i=2*******
*******i=2*******j=0    dataptr:        0x6dfe74        (*dataptr)      4
*******i=2*******j=1    dataptr:        0x6dfe78        (*dataptr)      5
*******i=2*******j=2    dataptr:        0x6dfe7c        (*dataptr)      8
*******i=2*******j=3    dataptr:        0x6dfe80        (*dataptr)      13
*******i=2*******j=4    dataptr:        0x6dfe84        (*dataptr)      20
*******i=3*******
*******i=3*******j=0    dataptr:        0x6dfe88        (*dataptr)      9
*******i=3*******j=1    dataptr:        0x6dfe8c        (*dataptr)      10
*******i=3*******j=2    dataptr:        0x6dfe90        (*dataptr)      13
*******i=3*******j=3    dataptr:        0x6dfe94        (*dataptr)      18
*******i=3*******j=4    dataptr:        0x6dfe98        (*dataptr)      25
*******i=4*******
*******i=4*******j=0    dataptr:        0x6dfe9c        (*dataptr)      16
*******i=4*******j=1    dataptr:        0x6dfea0        (*dataptr)      17
*******i=4*******j=2    dataptr:        0x6dfea4        (*dataptr)      20
*******i=4*******j=3    dataptr:        0x6dfea8        (*dataptr)      25
*******i=4*******j=4    dataptr:        0x6dfeac        (*dataptr)      32

5.1.2 三维数组

二维数组可以看作一维数组的叠加,三维数组可以看作二维数组的叠加

《C指针》学习笔记( 第四、五章)指针与字符串、指针与多维数组相关推荐

  1. 机器学习理论《统计学习方法》学习笔记:第五章 决策树

    机器学习理论<统计学习方法>学习笔记:第五章 决策树 决策树 5.1 决策树模型与学习 5.1.1 决策树模型 5.1.2 决策树与if-then规则 5.1.3 决策树与条件概率分布 5 ...

  2. Python入门:对Excel数据处理的学习笔记【第五章】列表类型处理技术

    注:该学习笔记是根据曾志贤老师编写的<从Excel到Python,用Python轻松处理Excel数据>所学习整理的笔记. 第五章 列表类型处理技术 列表是Python中最基础的数据结构. ...

  3. 《JavaScript高级程序设计(第四版)》红宝书学习笔记(第五章:基本引用类型,原始值包装类型,单例内置对象)

    第五章:基本引用类型 引用值(或者对象)是某个特定引用类型的实例.新对象通过使用new操作符后跟一个构造函数(constructor)来创建. 5.1 Date 这里不对Date进行详细深入,仅基于书 ...

  4. 《自然语言处理(哈工大 关毅 64集视频)》学习笔记:第五章 n-gram语言模型

    视频列表: 31 n-gram语言模型(一) 32 n-gram语言模型(二) 33 n-gram语言模型(三) 34 n-gram语言模型(四) 35 n-gram语言模型(五) 36 n-gram ...

  5. Objective-C学习笔记第十五章文件加载与保存

    第十五章文件加载与保存 Cocoa提供了Core Data,他能在后台处理所有文件内容 Cocoa提供了两个通用的文件处理类:属性列表和对象编码 一.属性列表类 在Cocoa中,有一类名为属性列表的对 ...

  6. 【机器学习-周志华】学习笔记-第十五章

    记录第一遍没看懂的 记录觉得有用的 其他章节:         第一章         第三章         第五章         第六章         第七章         第八章      ...

  7. Java编程思想总结篇(1-11章学习笔记)——第五章

    第五章 初始化与清理 1.用构造器确保初始化 构造器:和类名相同,分无参构造器和有参构造器. 和C++一样,你不写他也会帮你写. 构造器有利于减少错误,并使代码更易阅读.从概念上讲,"初始化 ...

  8. 数学建模学习笔记(第五章:6个动态模型-微分方程的建立与分析)

    第五章:动态模型(微分方程建模) ·  预报与决策类型 ·  描述对象特征随时间或空间的演变过程: ·  分析对象特征的变化规律: ·  预报对象特征的未来特征: ·  研究控制对象特征的手段等. 这 ...

  9. 【学习笔记】第五章 python3核心技术与实践--字典和集合

    [第四章]思考题的答案,仅供参考: []比list()更快,因为调用了list函数有一定的时间,而[]却没有. 前面我们学习了 Python 中的列表和元组,了解了他们的基本操作和性能比较.这节章,我 ...

  10. JAVA学习笔记(第五章 接口与继承)

    一.什么是接口 接口就像是一种模板,接口中放着没有内容的方法,类要是使用接口就必须声明接口中的方法.下面继续以LOL游戏为例: LOL的英雄,有些能够使用物理攻击,有些能够使用魔法攻击击,有些则两种攻 ...

最新文章

  1. document.all.item的解释和一个表单向多页面提交
  2. 广东省工业和信息化厅关于印发广东省 5G 基站和数据中心总体布局规划 (2021-2025 年)的通知...
  3. GitHub与GitLab的区别
  4. 【Linux】Linux内核的整体架构简介
  5. CSS文本溢出的处理方法总结
  6. 【VS开发】【miscellaneous】 Windows下配置Git
  7. px和毫米的换算_像素跟毫米换算(像素和毫米换算器)
  8. 卡尔曼滤波(Kalman Filtering)——(7)扩展卡尔曼滤波(EKF)一阶滤波
  9. 【Unity】出现NullReferenceException:Object reference not set to an instance of an object.的原因总结
  10. 计算机如何引用表格,(Excel如何实现跨文件表引用数据)excel引用其他表格数据路径...
  11. PayPal支付功能实现
  12. 74HC595芯片工作原理细致分析(以及级联拓展应用),以及芯片控制继电器原理 / 代码
  13. 处理 JS中 undefined 的7个技巧
  14. threejs粒子效果
  15. 大神有没有?看看ajax post 数据到WCF为啥总报405或跨域?
  16. 笔记本性能参数有哪些
  17. 大三学弟的学习面试经验,他很成熟
  18. vscode使用remote--ssh进行远程连接报错Resolver error: Error: Connecting with SSH timed out
  19. 持续更新 BUUCTF——PWN(一)
  20. java爬虫拉勾网_[Java教程]node.js爬虫爬取拉勾网职位信息

热门文章

  1. 移动硬盘插入笔记本会后,右下角有图标显示,但是我的电脑里面不显示,导致打不开硬盘
  2. mysql查询每行重复_MySQL查询返回重复的行
  3. 【ITPM】TW1:ISchool 项目前期分析说明书
  4. vue view design 图标选择器
  5. 转型经验分享|作为传统汽车工程师,我如何转型去阿里做无人驾驶?
  6. c++录屏、FFmpeg录屏、录屏格式转换
  7. 云计算基础-云计算基础介绍整理
  8. vue通过v-for取出的一个字段是时间戳格式转换成年月日
  9. 如何认识和投身 Web 3.0?
  10. html显示一条直线,如何在HTML中画一条线