【C语言学习笔记】数组、字符串、指针
来源:互联网 发布:网络发票号 编辑:程序博客网 时间:2024/04/30 11:28
第一部分 数组
一、数组的基本使用
(1)定义格式:类型 数组名[元素个数];
(2)遍历:按顺序查看数组的每一个元素
(3)使用注意:
1> 如果想在定义数组的同时进行初始化,数组的元素个数必须是常量,或者不写
(1)
(2)数组在内存中的存储方式与变量不同,数组寻址方式是由大到小,内存给数组分配了存储空间之后,其中数组元素在内存中存储的方式是由小到大
三、数组和函数
(1)数组作为函数参数,可以省略元素个数
(2)数组作为函数参数,传递是整个数组的地址,修改函数形参中数组元素的值,会影响到外面实参的数组元素的值
(3)数组当做函数参数传递时,会当做指针变量来使用,指针变量在64bit编译器环境下,占据8个字节
(4)数组名是整个数组的首地址
四、二维数组
二维数组是一个特殊的一维数组:它的元素是一维数组。例如,int c [2][2]可以看作由一维数组c[0]和一维数组c[1]组成,这两个一维数组都包含了2个int类型的元素
(1)定义格式:类型 数组名[元素个数];
(2)遍历:按顺序查看数组的每一个元素
(3)使用注意:
1> 如果想在定义数组的同时进行初始化,数组的元素个数必须是常量,或者不写
a> int ages[5] = {1, 2, 3, 4, 5}; b> int ages[] = {1, 2, 3}; c> int ages[‘A’ - 60] = {1, 2, 3, 4, 5};2> 如果元素个数是变量,那不能在定义数组的同时进行初始化,需要单独进行初始化
int count = 3; int ages[count]; //单独初始化 ages[0] = 8; ages[1] = 9; ages[2] = 10;3> 计算数组元素的个数
int count = sizeof (ages) / sizeof (int);二、数组的内存存储细节
(1)
char cs[5] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’}; int ages[3] = {10, 19, 23};
(2)数组在内存中的存储方式与变量不同,数组寻址方式是由大到小,内存给数组分配了存储空间之后,其中数组元素在内存中存储的方式是由小到大
三、数组和函数
(1)数组作为函数参数,可以省略元素个数
(2)数组作为函数参数,传递是整个数组的地址,修改函数形参中数组元素的值,会影响到外面实参的数组元素的值
(3)数组当做函数参数传递时,会当做指针变量来使用,指针变量在64bit编译器环境下,占据8个字节
(4)数组名是整个数组的首地址
四、二维数组
二维数组是一个特殊的一维数组:它的元素是一维数组。例如,int c [2][2]可以看作由一维数组c[0]和一维数组c[1]组成,这两个一维数组都包含了2个int类型的元素
五、课后练习
/*设计一个函数:将一维整型数组中的元素逆序存放。比如本来是1,3,4,2,逆序存放就变成了:2,4,3,1 */#include <stdio.h>void ni_xu (int a[], int n);int main(void){ // 定义数组 int array[] = {1, 3, 4, 2}; // 先输出一次数组内容 printf("数组为:\n"); for (int i = 0; i < sizeof(array) / sizeof(int); i++) { printf("%d ", array[i]); } printf("\n"); // 经过逆序存放 ni_xu(array, sizeof(array) / sizeof(int)); return 0;}void ni_xu (int a[], int n){ // 把1和2对换,把3和4对换,对换2次 for (int i = 0; i < n/2; i++) { int temp = a[i]; a[i] = a[n-1-i]; a[n-1-i] = temp; } printf("数组逆序存放后为:\n"); for (int i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n");}
第二部分 字符串
一、利用字符数组来存储字符串
char name[10] = "jack";二、字符串的初始化
(1)基本使用
1> char name[8] = “it”; 2> char name2[8] = {‘i’, ’t’, ‘\0’}; 3> char name3[8] = {‘i’, ’t’, 0}; //因为\0的ASCII码值是0。 4> char name4[8] = {‘i’, ’t’, 0, 0, 0, 0, 0, 0}; //因为多余的内存要以0来补齐,所以也能当做字符串(2)使用注意:
1> 字符串和字符数组的区别:
字符数组:char name5[] = {‘i’, ’t'};数组元素中没有’\0’
2> \0是字符串结束的标志
三、strlen函数:计算字符串长度
(1)计算的是字符数,并不是字数,一个汉字占3个字符数
(2)计算字符串长度时,\0并不包括在内
(3)从某个地址开始数字符的个数,直到遇到\0为止
四、字符串数组
(1)使用场合:需要存储多个字符串的时候
(2)初始化:char names[2][10] = {“jack”, “rose"};
第三部分 指针
一、基本使用
(2)指针变量就一个作用,只能存储地址,能够根据一个地址值,访问对应的存储空间
(3)指针变量p前面的int,指针变量p只能指向int类型的数据
(4)*的作用:
1> int *p;中的*:仅仅是个象征,说明p是个指针,没有其他特殊含义
2> *p = 20;中的*:间接运算符,访问指针变量p指向的存储空间
二、使用注意:
(1)定义指针的变量类型须和指针变量指向的变量类型一致,不能出现下面的情况:
三、指向指针的指针
(1)数组元素的访问方式
1> 数组名[下标] ages[1]
2> 指针变量名[下标] p[1]
3>
五、指针和字符串
(1)定义字符串
1> 利用数组
b> 使用场合:字符串的内容不需要经常修改
2> 利用指针
b> 使用场合:字符串的内容不需要修改,而且这个字符串是经常使用的
(2)定义字符串数组
1> 以指针数组形式:
int a = 10; int *p; p = &a; //指针变量p指向了变量a *p = 20; //把20赋值给了a(1)格式:变量类型 *变量名;
(2)指针变量就一个作用,只能存储地址,能够根据一个地址值,访问对应的存储空间
(3)指针变量p前面的int,指针变量p只能指向int类型的数据
(4)*的作用:
1> int *p;中的*:仅仅是个象征,说明p是个指针,没有其他特殊含义
2> *p = 20;中的*:间接运算符,访问指针变量p指向的存储空间
二、使用注意:
(1)定义指针的变量类型须和指针变量指向的变量类型一致,不能出现下面的情况:
//错误写法 int *p; double d = 10.0; p = &d; //指针指定数据类型的意义:指针取值的字节数(2)指针变量只能存储地址,不能出现下面情况
//错误写法 int *p; p = 200;(3)指针变量未经初始化,不能拿来使用,容易造成混乱
三、指向指针的指针
(1)int a = 10;(2)int *p = &a; //指针变量p指向a(3)int **p1 = &p;//指针变量p1指向指针变量p(4)int ***p2 = &p1;//指针变量p2指向指针变量p1四、指针和数组
(1)数组元素的访问方式
int ages[5]; int *p; p = ages;说明:数组名就是数组的首地址,也是数组元素的首地址,指针变量p志向了数组的首元素
1> 数组名[下标] ages[1]
2> 指针变量名[下标] p[1]
3>
p —> &ages[0] p + 1 —> &ages[1] p + 2 —> &ages[2] p + i —> &ages[i] 所以*(p + i)就是访问ages[i]的存储空间(2)指针变量+1究竟加多少,取决于指针的数据类型
五、指针和字符串
(1)定义字符串
1> 利用数组
char name[] = “itcast”;a> 特点:字符串里面的字符是可以修改的
b> 使用场合:字符串的内容不需要经常修改
2> 利用指针
char *name = “itcast”;a> 特点:是一个常量字符串,里面的字符不可以修改
b> 使用场合:字符串的内容不需要修改,而且这个字符串是经常使用的
(2)定义字符串数组
1> 以指针数组形式:
char *name[3] = {“jack”, “rose”, “jake”};2> 以二维字符数组形式:
char name2[3][10] = {“jack”, “rose”, “jake”};六、返回指针的函数
函数定义格式:
char *test ()//返回一个指针形式的字符串{ return “rose”;}七、指向函数的指针
double sum (double d, char *s, int a){}(1)定义指针变量指向sum函数
double (*p)(double, char *, int);p = sum; //指针变量p指向sum函数,函数名sum就是函数sum的地址或者double (*p)(double, char *, int) = sum;1> (*p)固定写法,代表指针变量p一定是指向函数的,切记()不能删除
2> p是变量名
3> 左边的double:指针变量p指向sum函数,sum函数返回double类型的数据
4> 右边的():指针变量p指向sum函数,sum函数有3个形参
(2)如何间接调用函数
1> p (5.8, “rose”, 10);
2> (*p) (5.8, “rose”, 10);
八、课后练习
/*编写一个函数void strlink(char *s, char *t) 将字符串t连接到字符串s的尾部*/#include <stdio.h>void strlink(char *s, char *t);int main(void){ // 定义两个字符串 char str1[20] = "Hello,"; char str2[] = "World!"; // 把str2复制到str1的后面 strlink(str1, str2); printf("%s\n", str1); return 0;}void strlink(char s[], char t[]){ // 1.遍历字符串s,找到结尾 while (*s != '\0') { s++; } // 2.找到字符串s的结尾,从字符串t的首字符开始复制,直到把'\0'复制过去 while ((*s = *t) != '\0') { s++; t++; }}
/*编写一个函数,判断某个字符串是否为回文。回文就是从左边开始读 和 从右边开始读 都是一样的,比如"abcba"*/#include <stdio.h>#include <string.h>int isHuiWen(char *p);int main(void){ // 定义字符串 char *string = "abcba"; // 定义变量保存结果,返回1则是回文,返回0则不是回文 int result = isHuiWen(string); if (result) { printf("%s是回文!\n", string); } else { printf("%s不是回文!\n", string); } return 0;}int isHuiWen(char *p){ // 定义指针变量指向字符串的首字符 char *left = p; // 定义指针变量指向字符串的末字符 char *right = p + strlen(p) - 1; while (left < right) { // 如果左边字符和右边字符不一样,则不是回文,返回0 if (*(left++) != *(right--)) { return 0; } } return 1;}
0 0
- 【C语言学习笔记】数组、字符串、指针
- 黑马程序员----C 语言学习笔记之数组指针与字符串指针
- 【C语言学习笔记】数组指针域指针数组
- ios学习路线—C语言(函数,数组,字符串,指针)
- C语言笔记 指针 数组
- C++|C++学习笔记|三、数组、字符串、指针
- C语言学习笔记(17) 数组和指针分析
- C语言深度剖析学习笔记-指针、数组、内存、函数
- 郝斌老师C语言学习笔记----指针和数组
- C语言练习-指针(数组,字符串)
- C语言基础之数组、字符串、指针
- C语言字符串、数组与指针结合
- C语言字符串指针---与数组0811
- C语言学习笔记之指向数组元素的指针和指向数组的指针
- C语言学习笔记(18) 指针数组和数组指针分析
- 【C语言】学习笔记:字符串与字符数组
- 黑马程序员-------c语言学习笔记之数组与字符串
- 学习笔记4-C语言数组和字符串
- 第三周——基于对象的程序设计——工资类(3)文件中读取数据
- 最近有什么好的php方面的书???
- Binding之MultiBinding
- mysql profiles
- Dubbo源码分析(二):Dubbo之消费端(Consumer)
- 【C语言学习笔记】数组、字符串、指针
- BI中事实表和维度表的定义
- 最少个数——dp
- CentOS 6 部署 Nginx + PHP5 服务器
- 运用CXF开发webService接口服务端和客户端
- 欢迎使用CSDN-markdown编辑器
- Android 快速开发系列 打造万能的ListView GridView 适配器
- GLSL经典入门教程汇总
- Linux awk 工具探索(转)