品牌购买平台,优化技术服务,想建设一个网站,爱做网站软件前言#xff1a;本文章讲解部分指针进阶内容。后续继续更新。 文章重点#xff1a; 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 目录 前言#xff1a;本文章讲解部分指针进阶内容。后续继续更新。
指针初阶了解#xff1a;
1.字符指针
1.1一道有关于字… 前言本文章讲解部分指针进阶内容。后续继续更新。 文章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 目录 前言本文章讲解部分指针进阶内容。后续继续更新。
指针初阶了解
1.字符指针
1.1一道有关于字符指针的面试题
2.指针数组
2.1指针数组使用方法 3.数组指针
3.1回顾下对数组名的理解
3.2数组指针的定义
3.3数组指针的使用
4.数组参数、指针参数
4.1一维数组传参
4.2二维数组传参 4.3一级指针传参
4.4二级指针传参 指针初阶了解
1. 指针就是个变量用来存放地址地址唯一标识一块内存空间。
2. 指针的大小是固定的4/8个字节32位平台/64位平台。
3. 指针是有类型指针的类型决定了指针的-整数的步长指针解引用操作的时候的权限。
4. 指针的运算。正文正式开始
1.字符指针
在指针的类型中我们知道有一种指针类型为字符指针 char* ;
将字符或者字符串首个地址放入指针变量中
int main()
{char ch w;char* pc ch;char* p abcdef;//p存放的是字符串首个字符的地址类似于数组printf(%s\n,abc);printf(%s\n,abcdef);printf(%c\n,abcdef[3]);//“abcdef”相当于数组名已知了首地址便可以根据下标打印字符printf(%c\n,*p);//可知道p存放的是字符“abcdef”的首字符地址printf(%s\n,p);//得到字符串首字符地址便可将字符全部打印出来return 0;
}注意“abcdef”是常量字符串而常量字符串是不能被修改的所以不能通过指针解引用来修改字符串内容。强行更改会导致程序崩溃。 为此我们可以在代码中加入const限制修改指针指向的内容
int main()
{const char* p abcdef;*p e;printf(%c, *p);return 0;
} 容易让我们以为是把字符串 hello 放到字符指针 pstr 里了但是/本质是把字符串 hello 首字符的地址放到了pstr中。 int main()
{const char* pstr hello;//这里是把一个字符串放到pstr指针变量里了吗printf(%s\n, pstr);return 0;
}
1.1一道有关于字符指针的面试题
代码给出可以自己在编译器运行试验
#include stdio.h
int main()
{char str1[] hello bit.;char str2[] hello bit.;const char *str3 hello bit.;const char *str4 hello bit.;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;
}1.首先知数组str1和数组str2存放的都是数组的地址但是编译器为两个数组在内存中分别开辟了两个空间来存放数组元素因此他们数组首元素的地址必然是不相同的。 2.对于str3和str4来说“hello bit.”是一个常量字符串。无法被修改因此无需保存多份相同内容因此str3和str4指针变量存放的是同一个常量字符串的地址。但是他们仍然是两个独立的指针变量只是存放的值是相同的。 总结str3和str4指向的是一个同一个常量字符串。C/C会把常量字符串存储到单独的一个内存区域当 几个指针。指向同一个字符串的时候他们实际会指向同一块内存。但是用相同的常量字符串去初始化 不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同str3和str4不同。 2.指针数组
在初始学习指针时我们也学了指针数组指针数组是一个存放指针的数组。
int* arr1[10]; //存放整形指针的数组
char *arr2[4]; //存放字符指针的数组
char **arr3[5];//二级字符指针的数组//存放在数组中的元素都是指针类型的
2.1指针数组使用方法
通常我们使用指针数组来模拟二维数组
int main()
{//创建三个一维数组int arr1[] { 1,2,3,4,5 };int arr2[] { 2,3,4,5,6 };int arr3[] { 3,4,5,6,7 };//创建一个指针数组来管理三个一维数组//使用指针数组来存放int *数据 arr1 arr2 arr3int* arr[] { arr1, arr2, arr3 };//指针数组int i 0;for (i 0; i 3; i){int j 0;for (j 0; j 5; j){printf(%d , arr[i][j]);}printf(\n);}return 0;
} 通过下小标访问数组元素模拟实现了一个二维数组 又比如
int main()
{//指针数组char* arr[5] { hello bit, hehe, xiaotiancai, woyao当大佬, C };int i 0;for (i 0; i 5; i){printf(%s\n, arr[i]);}return 0;
} 3.数组指针
3.1回顾下对数组名的理解 数组名是数组首元素的地址 但是存在2个例外 1. sizeof(数组名)这里的数组名表示整个数组sizeof(数组名)计算的是整个数组的大小单位是字节 2. 数组名这里的数组名表示整个数组取出的是数组的地址 int main()
{int arr[10];printf(%p\n, arr);//int*printf(%p\n, arr1);printf(%p\n, arr[0]);//int*printf(%p\n, arr[0] 1);printf(%p\n, arr);//printf(%p\n, arr1);//指针类型决定了指针1到底几个字节return 0;
} 总结根据上面的代码我们发现其实arr和arr虽然值是一样的但是意义是不一样的。 实际上 arr 表示的是数组的地址而不是数组首元素的地址。本例中 arr 的类型是 int(*)[10] 是一种数组指针类型 数组的地址1跳过整个数组的大小所以 arr1 相对于 arr 的差值是40. 3.2数组指针的定义 数组指针是指针还是数组 答案是指针。 整形指针 int * ps; 能够指向整形数据的指针。 浮点型指针 float * pr; 能够指向浮点型数据的指针。 那数组指针应该是能够指向数组的指针。 int *p1[10]; //指针数组int (*p2)[10];//解释p先和*结合说明p是一个指针变量然后指着指向的是一个大小为10个整型的数组。所以p是一个
指针指向一个数组叫数组指针。//这里要注意[]的优先级要高于*号的所以必须加上来保证p先和*结合。3.3数组指针的使用 数组指针指向的是数组那数组指针中存放的应该是数组的地址。 #include stdio.h
void print_arr1(int arr[3][5], int row, int col)
{int i 0;for (i 0; i row; i){int j;for (j 0; j col; j){printf(%d , arr[i][j]);}printf(\n);}
}
void print_arr2(int(*arr)[5], int row, int col)
{int i 0;for (i 0; i row; i){int j;for (j 0; j col; j){printf(%d , arr[i][j]);}printf(\n);}
}
int main()
{int arr[3][5] { 1,2,3,4,5,6,7,8,9,10 };print_arr1(arr, 3, 5);//数组名arr表示首元素的地址//但是二维数组的首元素是二维数组的第一行//所以这里传递的arr其实相当于第一行的地址是一维数组的地址//可以数组指针来接收printf(\n);print_arr2(arr, 3, 5);return 0;
} 我们来看看下面的代码分别是什么意思
int arr[5];
int *parr1[10];
int (*parr2)[10];
int (*parr3[10])[5];
arr是一个整型数组能存放五个整型数据。parr1是一个整型指针数组能够存放十个int *类型元素。parr2是一个数组指针该指针指向的是一个数组数组里有十个元素,每个元素是int。parr3是一个数组是存放数组指针的数组。
4.数组参数、指针参数
在写代码的时候难免要把【数组】或者【指针】传给函数那函数的参数该如何设计呢
4.1一维数组传参 以上一维数组传参都是正确的。
4.2二维数组传参 4.3一级指针传参 一级指针传参一级指针接收 当一个函数的参数部分为一级指针的时候函数能接收什么参数 void test(int* p)
{;
}//可以传递的有int a10;int *ptra;int arr[5];test(arr);//可以传一维数组数组名test(a);//可以传变量的地址test(ptr);//可以传整型指针 4.4二级指针传参 二级指针传参二级指针接收 当一个函数的参数部分为二级指针的时候函数能接收什么参数 void test(char **p)
{;
}int main()
{char c b;char*pc c;char**ppc pc;char* arr[10];test(pc);//可以传一个一级指针变量的地址test(ppc);//可以传一个二级指针变量test(arr);//可以传一个数组二级指针地址return 0;
}今天的内容到此结束下一节将继续更新C指针进阶内容。感谢大佬们的支持。