网站搭建用什么软件,网站有没有做网站地图怎么看,h5网站建设 网站定制开发,怎样网页制作#x1f497;个人主页#x1f497; ⭐个人专栏——C语言初步学习⭐ #x1f4ab;点击关注#x1f929;一起学习C语言#x1f4af;#x1f4ab; 目录 导读#xff1a;1. 字符指针1.1 字符串的引用方式1.2 有趣的面试题 2. 数组指针2.1 一维数组指针的定义2.2 一维数组… 个人主页 ⭐个人专栏——C语言初步学习⭐ 点击关注一起学习C语言 目录 导读1. 字符指针1.1 字符串的引用方式1.2 有趣的面试题 2. 数组指针2.1 一维数组指针的定义2.2 一维数组指针的使用2.3 二维数组指针的地址2.4 二维数组指针的使用 导读
前面我们学习了善于利用指针一主要讲解了指针的定义、基本用法和一些简单的运算使用算是指针的初步学习了。 今天我们来学习指针的进阶。 后面还有第三部分的讲解点击关注掌握第一信息
1. 字符指针
在前面学习指针的类型中我们知道有一种指针类型为字符指针char* 一般使用:
int main()
{char ch w;char* pc ch;*pc w;return 0;
}1.1 字符串的引用方式
在C程序中字符串是存放在字符数组中的。我们可以用字符指针变量指向一个字符串常量通过字符指针变量引用字符串常量。
int main()
{char* pstr I love China!;//这里是把一个字符串放到pstr指针变量里了吗printf(%s\n, pstr);return 0;
}特别容易让同学以为是把字符串 I love China! 放到字符指针pstr 里了但是本质是把字符串 I love China! 首字符的地址放到了pstr中。 注意
char * pstr I love China!;等价于
char * pstr;//定义一个char*型变量
pstr I love China!;
//把字符串第一个元素的地址赋给字符指针变量pstr1.2 有趣的面试题
int main()
{char str1[] hello world.;char str2[] hello world.;const char* str3 hello world.;const char* str4 hello world.;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;
}我们来看输出结果并思考是为什么 我们进入调试看一下 这里str3和str4指向的是一个同一个常量字符串。 C/C会把常量字符串存储到单独的一个内存区域。 当几个指针指向同一个字符串的时候他们实际会指向同一块内存。 但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。 所以str1和str2不同str3和str4不同。 2. 数组指针
我们在之前提到了数组指针今天我们再进一步的了解数组指针的使用
2.1 一维数组指针的定义
数组指针能够指向数组的指针。 数组指针的定义方式与指针的定义方式类似只不过需要在变量名字之前添加一个数组类型的修饰符。 int *p1[10];//一维数组指针int (*p2)[10];//二维数组指针p2先和*结合说明p2是一个指针变量然后指向的是一个大小为10个整型的数组。所以p2是一个指针指向一个数组叫数组指针。 这里要注意[]的优先级要高于 * 号的所以必须加上来保证p先和结合。
2.2 一维数组指针的使用
可以通过数组指针进行数组的遍历和修改。
int main()
{int arr[5] { 1, 2, 3, 4, 5 };int(*ptr)[5] arr;for (int i 0; i 5; i) {(*ptr)[i] * 2;}printf(%d\n,arr[2]);// 输出6数组第三个元素已经被修改为原来的两倍
}通过数组指针数组的传递和返回。
void print_arr(int(*ptr)[5], int len)
{for (int i 0; i len; i) {printf(%d , (*ptr)[i]);}
}
int main()
{int arr[5] { 1, 2, 3, 4, 5 };int(*ptr)[5] arr;print_arr(ptr, 5); // 输出1 2 3 4 5return 0;
}2.3 二维数组指针的地址
假设二维数组的起始地址为2000一个整型占4个字节arr1的值应该是20004x42016arr2的值为2032
表示形式含义值arr二维数组名指向一维数组arr[0]即0行起始地址2000*(arr0) arr[0],*arr0行0列元素地址2000arr1,arr[1]1行起始地址2016arr[1],*(arr1)1行0列元素arr[1][0]的地址2016*(arr1)2,arr[1][2],arr[1]2,1行2列元素arr[1][2]的地址2024* ( arr[1]2), * ( *(arr1)2), arr[1][2]1行2列元素arr[1][2]的值是元素值为7
2.4 二维数组指针的使用
传递数组指针给函数
void print_arr(int (*p)[4], int row)
{for (int i 0; i row; i) {for (int j 0; j 4; j) {printf(%d , *(*(pi)j));}printf(\n);}
}int main()
{int arr[3][4] {{1,2,3,4},{5,6,7,8},{9,10,11,12}};print_arr(arr, 3); // 传递数组指针arr给函数print_arrreturn 0;
}