家装设计师网站,wordpress关注插件,工业控制软件开发,虚拟货币做空网站目录 19.字符指针变量 *定义 *简单说明 *如果是字符串 *像数组一样指定访问常量字符串的字符 *练习 20.数组指针变量 *定义 *格式 *例子 问题1 问题2 *利用指针打印 21.二维数组传参的本质 *回顾 往期推荐 19.字符指针变量
*定义
指向字符的指针变量#xff0c;用于存储字符… 目录 19.字符指针变量 *定义 *简单说明 *如果是字符串 *像数组一样指定访问常量字符串的字符 *练习 20.数组指针变量 *定义 *格式 *例子 问题1 问题2 *利用指针打印 21.二维数组传参的本质 *回顾 往期推荐 19.字符指针变量
*定义
指向字符的指针变量用于存储字符在内存中的地址
#define _CRT_SECURE_NO_WARNINGS
#include stdio.h
int main()
{char a m;char* pc a;return 0;
} *简单说明
x86环境下F11逐语句运行至return 0;
转到内存输入a 输入pc 13 fc 6f 00--倒着写--00 6f fc 13--0x006ffc13是a的地址 *如果是字符串
回忆之前的内容
#include stdio.h
int main()
{char arr[]abcdef;char *pcarr;return 0
}
arr数组存储着字符串arr是数组首元素的地址
类比数组如果是字符串
#include stdio.h
int main()
{char* pc abcdef;return 0;
}
x86环境下F11逐语句运行至return 0;
转到内存输入pc 同理倒着写地址
地址框中输入0x00f07bcc 就找到了abcdef arr数组是一段连续的空间数组的内容是可以变的所以常量字符串char* pc abcdef;)abcdef\0)也是一段连续的空间常量字符串的内容不可以变类比const修饰
const修饰见38.【C语言】指针重难点C)
写成下方这样程序会崩溃会报错写入权限访问冲突
char* pc abcedf;
*pc abc; *像数组一样指定访问常量字符串的字符
printf(%c,abcdef[2]);
访问abcdef常量字符串的第二个字符c
类似于
char arr[]abcdef;
printf(%c,arr[2]);
同理
printf(%s,pc);
类似于
char arr[]abcdef;
printf(%s,arr);
*练习
求输出结果 #include stdio.h
int main()
{char str1[] abc;char str2[] abc;const char* str3 abc;const char* str4 abc;if (str1 str2)printf(str1 and str2 are same\n);elseprintf(str1 and str2 are not same\n);if (str3 str4)printf(str3 and str4 are same\n);elseprintf(str3 and str4 are not same\n);return 0;
}
分析上方代码的不是比较两个字符串的内容是否相等比较字符串相等用的是strcmp函数
这里比的分别是数组首元素的地址和常量字符串首字符的地址
虽然两个数组的内容一样但是abc字符串创建了两次str1和str2存储的数组的首元素的地址不一样所以not same
由于常量字符串具有内容不可以变的特点因此abc没有必要创建两次所以str3和str4是same 下面调用内存说明
x86环境下F11逐语句运行至return 0;
输入str1
输入str2 输入str3 输入str4 str3和str4都是cc 7b fa 00 ,指向地址0x00fa7bcc 20.数组指针变量 *定义
类比字符指针变量的定义数组指针变量存放的是数组指针地址
*格式 数据类型 (*指针变量名称)[数组元素个数]数组名
*例子
问题1以下代码运行是否有错误
#include stdio.h
int main()
{int arr1[5] { 1,2,3,4,5 };int* p1 arr1;int arr2[5]{ 0 };int *p2[5] arr2;int arr3[5]{ 0 };int (*p3)[5] arr3;int arr4[5]{ 0 };int* (*p4)[5] arr4;return 0;
}
分析p2的定义出了问题 由操作符运算优先级见15.25【C语言】操作符的属性可知*p2[5]代表数组不能为数组赋值arr
[ ]的优先级要高于*号的所以必须加上来保证p先和*结合表明p2是指向数组的指针变量即数组指针变量也就是定义p3的写法
问题2p1p3p4的定义有什么区别
去除int *p2[5]arr;这一行后打开调试模式x86环境下F11逐语句运行至return 0;
监视arr,p1,p3,p4 打开内存
输入p1 输入p3 输入p4 显然p1是整型指针p3是数组指针指向整个含5个int元素的数组的指针p4是数组指针指向含5个int*指针的数组的指针
*利用指针打印
p--arr
*p--*arr即arr
21.二维数组传参的本质
*回顾
见13.5.【C语言】二维数组
*打印
写法1实参形参全是二维数组
#include stdio.h
void test(int a[3][5], int r, int c)
{int i 0;int j 0;for(i0; ir; i){for(j0; jc; j){printf(%d , a[i][j]);}printf(\n);}
}int main()
{int arr[3][5] {{1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7}};test(arr, 3, 5);return 0;
} 写法2指针
回顾一维数组的数组名是首元素单个“0”维数组的地址可以推出二维数组的数组名是首元素第一行一维数组的地址同理三维数组的数组名是首元素二维数组的地址
所以可以用指针访问
对上方代码略加改动
#include stdio.h
void test(int (*p)[5], int r, int c)
{int i 0;int j 0;for (i 0; i r; i){for (j 0; j c; j){printf(%d , p[i][j]);}printf(\n);}
}int main()
{int arr[3][5] { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };test(arr, 3, 5);return 0;
}
打印时p[i][j]有别的写法
如 *(pi)[j],*(*(pi)j) 总结二维数组传参的本质传递了地址传递的是第一行这个一维数组的地址 往期推荐
19.【C语言】指针重难点A
37.【C语言】指针重难点B
38.【C语言】指针重难点C)
39.【C语言】指针重难点D
40.【C语言】指针重难点E
43.【C语言】指针重难点F)