指针(2)
利用指针求数组最大值和最小值
#include <iostream>
using namespace std;
void max_min_value(int *array, int n, int *maxp, int *minp){
// maxp指向主函数的max变量, minp指向主函数的min变量
int *array_end = array + n;
// 假定第一个元素就是最大值和最小值
*maxp = *minp = *array;
for (int *p = array+1; p< array_end ;p++) {
if (*p > *maxp)
*maxp = *p;
else if(*p< *minp)
*minp = *p;
}
}
int main() {
// 指针版本数组最大值和最小值
int number[10], *p = number, max, min;
// 23 32 34 43 43 55 67 88 44 1
for (int i = 0; i < 10; ++i) {
cin >> *(p + i);
}
max_min_value(p, 10, &max, &min);
for (int i = 0; i < 10; ++i) {
cout<< *(p + i) << "\t";
}
cout<<endl;
cout<< "max = " <<max << " min = "<< min <<endl;
}
选择排序
#include <iostream>
using namespace std;
// 我们正常从头到尾扫描最小的数据, 将数据放到第一个位置, 在将剩余的数组中扫到第二小的值,放到第二个位置, 以此类推
void select_sort(int arr[], int len){
for (int i = 0; i < len -1 ; ++i) {
int p = i; // 记录最小值的下标, 初始是 i
for (int j = i + 1; j < len; ++j) {
if (arr[j] < arr[p])
p = j;
}
// 这里已经产生本轮最小值的下标
if (p!=i){
int temp = arr[p];
arr[p] = arr[i];
arr[i] = temp;
}
}
}
int main() {
int a[6] = {8, 4, 9, 6, 5, 2};
select_sort(a, 6);
for (int i = 0; i < 6; ++i) {
cout<< a[i] << "\t";
}
}
指针版本选择排序
#include <iostream>
using namespace std;
// 通过指针访问数组元素, 实现选择排序法
void select_sort(int *a, int len){
for(int *p = a; p < a+len-1; p++){
int *minp = p;
for(int *q = p+1; q < a+len ; q++){
if (*q < *minp)
minp = q;
}
if (p != minp){
int temp = *p;
*p = *minp;
*minp = temp;
}
}
}
int main() {
int a[6] = {8, 4, 9, 6, 5, 2};
select_sort(a, 6);
for (int i = 0; i < 6; ++i) {
cout<< a[i] << "\t";
}
}
字符指针
字符数组 在C++中可以最为整型数组处理, 相反也可以
小区别
char c1[10]; int c2[10]
c1分配的空间是10字节 , c2是40字节
c++ 中字符数组用来表示和处理字符串, 规定字符串以 '\0’作为字符串结束标志 '\0的ASCII值为0, 就是空字符;
#include <iostream>
using namespace std;
#include <cstring>
int main() {
char s1[] = {"Good!"};
char s2[] = "Good!";
char s3[] = {'G', 'o', 'o', 'd', '!', '\0'};
cout<< sizeof(s1)/sizeof(s1[0])<< endl; // 6真实内存的占用长度
cout<< sizeof(s2)/sizeof(s2[0])<< endl; // 6
cout<< sizeof(s3)/sizeof(s3[0])<< endl; // 6
cout<< strlen(s1) << endl; // 5实际字符的个数
cout<< strlen(s2) << endl; // 5
cout<< strlen(s3) << endl; // 5
}
字符数组追加
#include <iostream>
using namespace std;
#include <cstring>
int main() {
char a[20] = "ABCD", b[10] = "EFG";
// 拼接两个字符数组
int i = strlen(a); // 字符串a的长度
for (int j = 0; b[j] != '\0' ; ++j, i++)
a[i] = b[j];
a[i] = '\0';
cout<< a << endl;
}
用字符指针访问方式实现
#include <iostream>
using namespace std;
#include <cstring>
int main() {
char a[20] = "ABCD", b[10] = "EFG";
char *pa = a, *pb = b;
while (*pa != '\0')
pa++;
while (*pb != '\0'){
*pa = *pb;
pa++;
pb++;
}
*pa = '\0';
pa = a;
cout<< pa << endl;
cout<< a << endl;
}
字符指针作为函数参数, 求字符串的长度
#include <iostream>
using namespace std;
int my_strlen(char *s){
int count = 0;
for (; *s !='\0'; s++)
count++;
return count;
}
int main() {
char str[] = "Hello!";
cout<< *str <<endl; // H
cout<< str <<endl; // Hello!
cout<< my_strlen(str) <<endl; // Hello!
cout<< *str <<endl; // H
}
编写 my_strcmp 比较两个字符串的大小
char s1[ ] = "Hello!";
char *s2 = "Hello!";
cout<< my_strcmp(s1, s2)<<'\t'; // 0
cout<< my_strcmp("Hi", s2)<<endl; // 1
cout<< my_strcmp(s2, "Hi")<<endl; // -1