笔记:二维数组,字符串,指针

#mark- 01-二维数组基本概念

//问题:什么是二维数组?二维数组的格式?二维数组如何存储?二维数组是如何遍历?

1.二维数组: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组

2.二维数组格式:

元素类型 数组名称[一维数组的个数][每个一维数组的元素个数];

元素类型 数组名称[行数][列数];

元素类型: 说明二维数组中每个一维数组存储什么类型的数据

一维数组的个数: 说明二维数组有多少个元素

每个一维数组的元素个数 :  说明二维数组中每一个一维数组的元素个数

3.遍历二维数组

// 思路: 1.取出二维数组的每一个元素(取出二维数组中的一维数组)

//      2.遍历一维数组

for (int i = 0; i < 2; i++) { // 0 , 1

for (int j = 0; j < 3; j++) { // 0 , 1 , 2

printf("name[%i][%i] = %c\n", i, j, names[i][j]);

}

}

#mark- 02-二维数组注意点

//问题:二维数组如何初始化?

二维数组的多种初始化方式

// 1.定义的同时初始化

int names[2][3] =

{

{'l', 'n', 'j'},

{'x', 'm', 'g'}

};

// 2.先定义再初始化

int names2[2][3];

names2[0][0] = 'l';

names2[0][1] = 'n';

names2[0][2] = 'j';

names2[1][0] = 'x';

names2[1][1] = 'm';

names2[1][2] = 'g';

// 3.完全初始化

int names3[2][3] =

{

{'l', 'n', 'j'},

{'x', 'm', 'g'}

};

// 4.不完全初始化

int names4[2][3] =

{

{'l', 'n'},

};

// 5.省略元素个数的两种写法

// 明确的告诉二维数组, 我们有2个一维数组

char names5[2][3] =

{

'l', 'n', 'j',

'x', 'm', 'g'

};

// 没有告诉二维数组我们有几个一维数组

// 如果在"定义的同时"进行初始化, 那么一位数组的个数可以省略 \

系统会自动根据每一个一维数组能够存放多少个元素, 自动根据初始化的值推断出二维数组中一共有多少个元素(多少个一维数组)

char names6[][3] =

{

'l', 'n', 'j',

'x', 'm', 'g',

'n', 'b'

};

// 6.错误写法

// 注意点: 每个一维数组的元素个数不能省略

/*

int names7[2][] =

{

{'l', 'n', 'j'},

{'x', 'm', 'g'}

};

*/

/*

// 搞不清楚应该分配多大的存储空间, 以及搞不清楚应该把哪些数据赋值给第一个数组, 以及哪些数据赋值给第二个数组

int names7[2][] =

{

'l', 'n', 'j',

'x', 'm', 'g'

};

*/

#mark- 03-二维数组和函数

//问题:二维数组作为函数参数传递?

//数组传递,值传递的区别

//二维数组可以省略一维数组的个数,不可省略一维数组有多少个元素

1.二维数组名称作为函数参数传递, 是传递的地址

change2(names);

void change2(char values[2][3])

{

values[0][1] = 'w';

printf("我执行了\n");

}

2.// 以后只要看到函数的参数是一个数组, 那么就是地址传递

// 在函数中修改形参的值会影响到参数

names[0] == 一维数组

change3(names[0]);

void change3(char values[])

{

values[0] = 'Q';

printf("我执行了\n");

}

3.// 基本数据类型

names[0][0] == 一维数组的一个元素 == 值

change4(names[0][0]);

void change4(char value)

{

value = 'E';

printf("我执行了\n");

}

#mark- 04-字符串基本概念

//问题:什么是字符串?如何初始化字符串?输出字符串?

//问题2:%s的原理?

1.用双引号引起来的就是字符串

2.字符串变量和普通的字符数组的区别

char str[] = "lnj"; // 字符串变量 l n j \0

// 字符数组 , 这个并不是字符串, 而是字符数组

char charValues[] = {'l', 'n', 'j'};

3.//C语言规定, 字符串必须以\0结尾(作为字符串的结束符号), 所以字符串变量的元素个数比字符数组的元素个数多一个 \0

4.//字符串变量输出的的原理

%s的原理, 从传入的"地址"开始逐个取出, 直到遇到"\0"为止

5.注意:字符串以\0结尾, 没有\0就不是字符串

6.//字符串的本质就是数组

char str6[] = "lnj";

str6[1] = 'y';

printf("%s", str6);

#mark- 05-子符串常用方法1

//问题:如何输出字符串?

//问题1:printf和puts 函数的区别

1.printf和puts 函数的区别

printf函数

弊端 : 如果想要换行, 必须加上\n

优点 : 可以自定义格式化需要输出的字符串, 也就是可以按照我们需要的格式来输出

puts函数

优点: 可以自动换行

缺点: 不可以自定义格式, 只能原样输出

//问题2:利用scanf接收字符串的有什么注意点?

2.输入字符串

1)利用scanf接收字符串的注意点

scanf接收字符串, 会以空格 , tab, 回车作为结束符号, 也就是说利用scanf接收字符串时, 字符串中不能出现空格, tab, 回车

2)利用gets接收字符串优点

优点: 如果利用gets接收字符串 , 可以在字符串中输入空格, tab

//问题3:如何计算字符串长度?

3.使用strlen 计算字符串长度

strlen的原理: 从传入的地址开始逐个取出字符串, 每取出一个就让计数器+1. 直到遇到\0为止

#mark- 06-字符串常用方法2

//问题:字符串如何拼接,拷贝,比较?

1.字符串拼接原理

strcat()

// 原理 : 首先遍历第一个字符串,直到遇到\0为止, 然后取出第二个字符串中的字符, 从\0的位置开始添加, 添加完毕之后再在最后添加一个\0

2.字符串拷贝原理

strcpy()

逐个替换, 拷贝了几个就替换几个

//strcpy函数会将源的数据拷贝到目标中, 并且会覆盖掉目标中原有的数据

// 目标的容积必须能够存放拷贝的数据, 如果容积不够会报错

3.字符串比较

strcmp()

// strcmp的原理: 取出字符串中的每一个字符进行逐个比较, 如果发现不相等就不会继续往下比较

#mark- 07-字符串练习

// 编写一个函数char_contains(char str[],char key), 如果字符串str中包含字符key则返回数值1,否则返回数值0

// 给你一个字符串和一个key, 要求从字符串中找出key, 如果找到就返回1没有找到就返回0

#mark- 08-字符串数组

//问题:什么是字符串数组?

// 如果想存储一堆字符串那么可以使用字符串数组

// 说白了字符串数组就是二维数组

#mark- 09-指针基本概念

//问题:什么是指针?格式?保存的是什么数据?指针有什么作用?

指针就是专门用于保存地址的

1.定义指针变量

普通变量:

数据类型 变量名称;

指针变量:

数据类型 * 变量名称;

数据类型 : 说明将来指针变量能够保存什么类型的变量的地址

注意: 指针变量是什么类型, 那么将来就只能保存什么类型变量的地址,

例如: 指针变量是int类型, 那么将来就只能保存int类型变量的地址

* : 没有任何特殊含义, 仅仅是为了标示这是一个指针变量

变量名称 : 用于区分不同的变量

2.指针 , 在64位编译器下占用8个字节

3.注意:指针变量前的*号代表访问指针变量指向的那一块存储空间

4.指针定义时,一定要给一个地址

int a = 10;

float b = 9.9;

int *p = &a;//指针定义时,初始化只能是地址

*p = 22;//指针定义后,给带星指针赋值,只能是数值

p = &b; //给不带星指针赋值,一定是地址

printf("a = %d, b = %d", a, *p);

#mark- 10-指针练习1

//问题:如何使用指针交换两个变量的值?

// 定义一个函数交换两个变量的值

注意:画图分析内存

和数组进行对比

void swap(int *v1, int *v2)

// int *v1 = &a, int *v2 = &b; v1 = 0ffc13 v2 = 0ffc9

// *v1 == a  *v2 == b

{

int temp = *v1; // int temp = 0ffc13

*v1 = *v2;

*v2 = temp;

}

#mark- 11-指针练习2

//问题:如何通过指针修改函数外部变量?

// 要求:定义一个函数, 传递三个值, 返回这三个值得和,差,平局值

注意:画图分析

int demo(int v1, int v2, int v3, int *p1, int *p2)

{

int sum = v1 + v2 + v3;

*p1 = sum;

int m = v1 - v2 - v3;

*p2 = m;

int average = sum / 3;

return average;

}

#mark- 12-指针注意点

//问题:指针的几个注意点?

// 1.指针只能保存地址

int *p = 200;

printf("%i\n", *p);

// 2.同一个变量可以有多个指针指向它

int num = 10;

int *p = #

// *p == num

//    num = 55;

*p = 55;

int *p1 = p;

*p1 = 100;

int *p2 = #

printf("%i\n", *p);

// 3.指针的指向可以修改

int a = 10;

int b = 5;

int *p = &a;

*p = 88;

p = &b;

*p = 44;

printf("%i\n", a);

printf("%i\n", b);

// 4.不要访问野指针

// 没有赋值的指针, 我们称之为野指针

//    int *p;

int *p = NULL; // 0

printf("%i\n", *p);

// 5.指针类型是什么类型, 就只能指向什么类型的数据

int num = 10;

char charValue = 'l';

double doubleValue = 9.9;

//    int *p = #

//    int *p = &charValue;

//    int *p = &doubleValue;

double *p = &doubleValue;

printf("%lf\n", *p);

#mark- 13-多级指针

//问题:如何使用多级指针?

多级指针的操作, 最简单的方式, 就是通过几颗星来存储, 就通过几颗星来访问

还有一种方式就是画图, 看图片中有几个箭头, 有几个简单就用几颗星来访问

#mark- 14-指针为什么要分类型

//指针为什么要分类型?

// 因为当我们利用指针去取值的时候, 系统就会自动根据指针的类型来确定应该取对少个字节中的值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,419评论 3 44
  • 第1章 第一个C程序第2章 C语言基础第3章 变量和数据类型第4章 顺序结构程序设计第5章 条件结构程序设计第6章...
    小狮子365阅读 10,520评论 3 71
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 3,870评论 2 13
  • 版权声明:本文为 gfson 原创文章,转载请注明出处。注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢...
    gfson阅读 2,880评论 0 6
  • 为寻找《精通情绪》这本书,早晨我找了二遍家里可以存放书籍的地方,书架、桌案、卧室(包括枕头边)、洗手间(我们家洗手...
    黄纳新阅读 389评论 0 2