开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情。
二、指针与数组
1、指针和数组关系
一、指向数组的指针 指针变量 [下标] * (指针变量+偏移量)
二、指针运算 跟指针类型 对应的基本类型
三、指针数组 每一个元素都是一个指针 指针数组是一个二维数组模型
数组和下标
指针数组的框图表示
2、多级指针
-
一级指针指向变量的地址
-
二级指针指向一级指针的地址
-
三级指针指向二级指针的地址
各级指针间的关系如下
- 三级指针==二级指针==&一级指针
** 三级指针==* 二级指针==一级指针==&变量
*** 三级指针==** 二级指针==* 一级指针==变量
多级指针框图表示
多级指针程序示例如下所示
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
int main0401()
{
int a[] = { 1,2,3 };
int b[] = { 4,5,6 };
int c[] = { 7,8,9 };
//指针数组是一个特殊的二维数组模型
//指针数组对应于二级指针
int* arr[] = { a,b,c };
//指针数组和二级指针建立关系
int** p = arr;
//arr[0][0] a[0]
//printf("%d\n", **p);
//二级指针加偏移量 相当于跳过了一个一维数组大小
//printf("%d\n", **(p + 1));
//一级指针加偏移量 相当于跳过了一个元素
//printf("%d\n", *(*p + 1));//arr[0][1]
//printf("%d\n", *(*(p + 1) + 1));
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
//printf("%d ", p[i][j]);
//printf("%d ", *(p[i] + j));
//printf("%d ", *(*(p + i) + j));
}
puts("");
}
return EXIT_SUCCESS;
}
int main0402(void)
{
int a = 10;
int b = 20;
int* p = &a;
int** pp = &p;
int*** ppp = &pp;
//*ppp==pp==&p
//**ppp==*pp==p==&a;
//***ppp==**pp==*p==a
//*pp = &b;//等价于p=&b;
**pp = 100;
//*pp = 100;//err
printf("%d\n", *p);
printf("%d\n", a);
return 0;
}
3、指针与函数
一、值传递和地址传递
二、数组作为函数参数 退化为指针丢失精度 需要传递元素个数
三、指针作为函数返回值
4、指针与字符串
一、栈区字符串和数据区字符串
二、字符串数组 指针数组模型
三、const修饰的指针 针对于字符串
四、主函数的形参
int argc 表示参数个数
char* argv[] 表示参数内容
五、字符串和指针的应用
-
字符串查找字符串个数
-
字符串查找字符个数
-
字符串反转和回文
六、字符串处理函数
strcpy() strncpy() 字符串拷贝
strcat() strncat() 字符串追加
strcmp() strncmp() 字符串比较 0 1 -1
sprintf() sscanf() 字符串格式化
strchr() strstr() 字符串查找 返回值类型为指针
strtok() 字符串分割 如果找到标志位用\0替换 会破坏源字符串
atoi() atof() atol() 字符串类型转换
写在文末
这是本人在学习C语言过程中的点滴记录,希望分享出来能与大家一起进步,如有表达不足或者有错误的地方,恳请大家积极批评指正!!