赞
踩
书接上回 拿捏c语言指针(上)
此篇主要讲解的是指针与数组之间的爱恨情仇,跟着我的脚步一起来看看吧~
创造不易,可以帮忙点点赞吗
如有差错,欢迎指出
1.sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小(单位:字节)
2.&数组名,数组名表示整个数组,取出的是整个数组的地址
让他们分别+1,得到的结果
p[i]==*(p+i)
arr[i]==*(arr+i) arr与i交换了后 *(i+arr)==i[arr]
一维数组传参传的不是整个数组,而是首元素的地址
如图,若是传的是整个数组,结果应该为10
一维数组传参,形参可以是数组,也可以是指针
所以,其中函数test形参int arr[]可以替换为指针形式int*arr
写一个函数,对一个整数数组的数据进行排序(升序)
思想:相邻两个元素比较,不满足顺序就交换
例如有一个降序数列:
9 8 7 6 5 4 3 2 1 0 未比较
8 9 7 6 5 4 3 2 1 0 8与9比较,9后移
…… 以此类推,9分别与7、 6 ……1、 0 比较
8 7 6 5 4 3 2 1 0 9 第一轮结束
7 8 6 5 4 3 2 1 0 9 7与8比较,8后移
……以此类推,直到排为升序~
- #include<stdio.h>
- void BubbleSort(int arr[], int sz)
- {
- int i = 0;
- for (i = 0; i < sz - 1; i++)
- {
- //一轮冒泡排序的过程
- int j = 0;
- for (j = 0; j < sz - 1 - i; j++)
- {
- //一对数字比较
- if (arr[j] > arr[j + 1])//交换条件
- {
- //交换
- int tmp = arr[j];
- arr[j] = arr[j + 1];
- arr[j + 1] = tmp;
- }
- }
- }
- }
- int main()
- {
- int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
- int sz = sizeof(arr) / sizeof(arr[0]);
- BubbleSort(arr, sz);
- for (int i = 0; i < sz; i++)
- {
- printf("%d ", arr[i]);
- }
数组arr{9,0,1,2,3,4,5,6,7,8},如果按照原代码,会傻傻地排45次
我们可以增加一些判断,进而提高代码运行效率,
如图,当排完数字9时,count=9;flag==0,第一轮结束
跳出里面for循环,开始第二轮,flag又被赋值为1,即flag==1
if条件判断0与1、1与2……7与8,判断了8次条件都不满足,此时count==17;flag==1,跳出循环
代码如下:
- #include<stdio.h>
-
- int count = 0;
- void BubbleSort(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 - 1 - i; j++)
- {
- count++;//用于计算排了几次
- //一对数字比较
- if (arr[j] > arr[j + 1])//交换条件
- {
- //交换
- int tmp = arr[j];
- arr[j] = arr[j + 1];
- arr[j + 1] = tmp;
- flag = 0;
- }
- }
- if (flag == 1)
- {
- break;
- }
- }
- }
- int main()
- {
- int arr[10] = { 9,0,1,2,3,4,5,6,7,8};
- int sz = sizeof(arr) / sizeof(arr[0]);
- BubbleSort(arr, sz);
- for (int i = 0; i < sz; i++)
- {
- printf("%d ", arr[i]);
- }
- printf("count=%d", count);
- }
指针变量也是变量,他也有自己地址
如图一级指针p存放的是变量a的地址,二级指针pp存放的是一级指针变量p的地址。
存放指针的数组,是数组(数组中每个元素是指针类型)
如:int*arr[4],每个元素都是整形指针
与二维数组的区别
二维数组的每一行是连续的,而模拟实现的不是。
示意图
可以把字符串想象是一个字符数组,但是这个数组是不能修改的
如图,打印*p的值不是字符串,而是字符串的第一个字符
不是把字符串abcdef\0存放在p中,而是把第一个字符的地址存放在p中
《剑指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;
- }
运行结果
解释:字符数组str1和str2是可以修改的,他们分别占用不同的空间,所以str1与str2不同
常量字符串str3和str4是不可以修改的,他们占用的空间一致,所以str3与str4相同
指向数组的指针,是指针
用于存放数组的地址,能够指向数组的指针变量
int* p1[10]: 指针数组,p1是数组,有10个元素,每个元素的类型是int*
int (*p2)[10]: 数组指针,p2是指针,有10个元素,每个元素的类型是int
二维数组传参本质上传的是一维数组(二维数组的第一行)的地址
例如
利用数组指针实现一个能够打印二维数组的函数
- #include<stdio.h>
-
- void Print(int(*arr)[5], int r, int c)
- {
- for (int i = 0; i < r; i++)
- {
- for (int j = 0; j < c; j++)
- {
- printf("%d ", *(*(arr + 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} };
- Print(arr, 3, 5);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。