提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 1.冒泡排序
- 2、二级指针
- 3.指针数组
- 4.指针数组模拟二级指针
- 5.字符指针变量
- 6.数组指针变量
- 6.1 数组指针变量是什么?
- 2.2 数组指针变量的初始化
前言
下面咱们在进行对指针的讲解。
1.冒泡排序
冒泡排序的核⼼思想就是:两两相邻的元素进行比较。
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,0,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
优化:
//⽅法2 - 优化
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int flag = 1;//假设这⼀趟已经有序了
int j = 0;
for (j = 0; j < sz - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
flag = 0;//发⽣交换就说明,⽆序
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
if (flag == 1)//这⼀趟没交换就说明已经有序,后续⽆序排序了
break;
}
}
2、二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?
这就是二级指针 。
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;
return 0;
}
调试结果:
根据调试和代码,我们可以画一个图,观察三者的联系:
对于⼆级指针的运算有:
• *ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa
int b = 20;
*ppa = &b;//等价于pa =&b
• **ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作: *pa ,那找到的是 a .
**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;
3.指针数组
第一次听到这个词组,一定会想是指针还是数组?
我们类比⼀下,整型数组,是存放整型的数组,字符数组是存放字符的数组。
那指针数组呢?是存放指针的数组。
写法:
int*arr[10];
4.指针数组模拟二级指针
int main()
{
//int* arr[10];//数组指针
int arr1[] = { 1,2,3,4 };
int arr2[] = { 2,3,4,5 };
int arr3[] = { 3,4,5,6 };
int*arr[3] = {arr1,arr2,arr3};//数组名是首地址
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
arr[i]是访问arr数组的元素,arr[i]找到的数组元素指向了整型⼀维数组,arr[i][j]就是整型一维数组中的元素。
上述的代码模拟出⼆维数组的效果,实际上并非完全是⼆维数组,因为每一行并非是连续的。
5.字符指针变量
在指针的类型中我们知道有⼀种指针类型为字符指针 char* ;
⼀般使用:
int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'w';
return 0;
}
还有⼀种使用方式如下:
int main()
{
char* str = "hello world";//常量字符串
printf("%s\n", str);
return 0;
}
代码 const char* pstr = “hello world.”; 特别容易让同学以为是把字符串 hello world 放
到字符指针 pstr ⾥了,但是本质是把字符串 hello world. ⾸字符的地址放到了pstr中。
上⾯代码的意思是把⼀个常量字符串的字符 h 的地址存放到指针变量 pstr 中。
《剑指offer》中收录了⼀道和字符串相关的笔试题,我们⼀起来学习⼀下:
#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");
else
printf("str1 and str2 are not same\n");
if(str3 ==str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
这⾥str3和str4指向的是⼀个同⼀个常量字符串。C/C++会把常量字符串存储到单独的⼀个内存区域,当⼏个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存。但是⽤相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。
6.数组指针变量
6.1 数组指针变量是什么?
之前我们学习了指针数组,指针数组是⼀种数组,数组中存放的是地址(指针)。
数组指针变量是指针变量?还是数组?
答案是:指针变量。
我们已经熟悉:
- 整形指针变量: int * pint; 存放的是整形变量的地址,能够指向整形数据的指针。
- 浮点型指针变量: float * pf; 存放浮点型变量的地址,能够指向浮点型数据的指针。
那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。
下⾯代码哪个是数组指针变量?
1 int *p1[10];
2 int (*p2)[10];
思考⼀下:p1, p2分别是什么?
数组指针变量
int (*p)[10];
解释:p先和* 结合,说明p是⼀个指针变量变量,然后指着指向的是⼀个大小为10个整型的数组。所以p是⼀个指针,指向⼀个数组,叫 数组指针。
这⾥要注意:[]的优先级要⾼于号的,所以必须加上()来保证p先和结合。
2.2 数组指针变量的初始化
数组指针变量是⽤来存放数组地址的,那怎么获得数组的地址呢?就是我们之前学习的 &数组名
1 int arr[10]={0};
2 &arr;
如果要存放个数组的地址,就得存放在数组指针变量中,如下:
int (*p)[10];
int main()
{
int arr[10] = { 0 };
int(*p)[10] = arr;
return 0;
}
我们调试也能看到 &arr 和 p 的类型是完全⼀致的。
数组指针类型解析:
完