首页 > 编程语言 >C++学习路线(十六)

C++学习路线(十六)

时间:2024-10-15 14:47:50浏览次数:8  
标签:char p1 const int void 十六 C++ 路线 input

void类型指针

void -> 空类型

void* -> 空类型指针,只存储地址的值,丢失类型,无法访问,要访问里面的值

我们必须对指针进行正确的类型转换,然后再间接引用指针

所有其它类型的指针都可以隐式自动转换成 void 类型指针,反之需要强制转换。

int arr[] = { 1, 2, 3, 4, 5 };
char ch = 'a';
void* ptr = arr;
printf("0x%p\n", ptr);
printf("%d\n", *(int*)ptr);

而且 void*指针 不允许算术运算

常见错误总结

1.使用未初始化指针

这里面去描述两种场景说明使用未初始化指针的场景

第一种场景 未初始化就使用

int x, * p;
x = 10;
printf("%p\n", p);
p = &x;

第二种场景 比较常见

void func(int* p) {
    static int count = 50;
    p = &count;
}

int main() {
    int x, * p;
    func(p);
    cout << "p = " << p << endl;
}

怎么解决上面的问题 之前的笔记有提到过 使用二级指针

#include <iostream>
using namespace std;

void func(int** p) {
	static int count = 50;
	*p = &count;
}

int main() {
	int x, * p;
	func(&p);
	cout << "p = " << p << endl;
}

2.将值当作地址赋值给指针

怎么解决

1)*p = x;

2)p = &x;

3.忘记解引直接访问内存

char input[64] = { 'h', 'e', 'l', 'l', 'o' };
char* p1, * p2;
p1 = &input[0];
p2 = &input[1];
if (p1 > p2) {
	cout << "p1 is greater than p2" << endl;
}
else {
	cout << "p2 is greater than p1" << endl;
}
return 0;

这种情况下 会打印 "p2 is greater than p1"

#include <iostream>
using namespace std;

int main() {
	char input[64] = { 'h', 'e', 'l', 'l', 'o' };
	char* p1, * p2;
	p1 = &input[0];
	p2 = &input[1];
	if (*p1 > *p2) {
		cout << "p1 is greater than p2" << endl;
	}
	else {
		cout << "p2 is greater than p1" << endl;
	}
	return 0;
}

4.常见的错误4:再次使用忽略重新赋初值

#include <iostream>
#include <string>
using namespace std;

int main() {
	char input[64];
	char* p1 = input;
	do {
		gets_s(input, 64);
		while (*p1 != '\0') printf("%c", *p1++);
	} while (strcmp(input, "exit") != 0);
	return 0;
}

这种只能打印第一个数字 因为p1没有被重新赋值给input

正确的做法是

#include <iostream>
#include <string>
using namespace std;

int main() {
	char input[64];
	char* p1;
	do {
		printf("Enter a string: ");
		gets_s(input, 64);
		p1 = input;
		while (*p1 != '\0') printf("%c", *p1++);
		printf("\n");
	} while (strcmp(input, "exit") != 0);
	return 0;
}

常量引用

在C++中可以声明const引用

语法:const Type&name = var;

const引用让变量拥有只读属性

分两种情况:
1.用变量初始化常引用
2.用字面量初始化常量引用
// 使用变量初始化常量引用
int a = 10;
const int& b = a;
// 用字面量初始化常量引用
const int& c = 20;//会给引用分配内存空间

函数指针

我们来探究一下 函数有没有指针

#include <iostream>
#include <string>
using namespace std;

int compare_int(const void* a, const void* b) {
	int* pa = (int*)a;
	int* pb = (int*)b;
	cout << "pa地址:" << &pa << endl;
	cout << "pb地址:" << &pb << endl;
	return *pa - *pb;
}

int main() {
	// 函数有没有地址?
	cout << "compare_int: " << &compare_int << endl;
	int x = 10, y = 20;
	compare_int(&x, &y);
	return 0;
}

函数指针的定义

#include <iostream>
#include <string>
using namespace std;

int compare_int(const void* a, const void* b) {
	int* pa = (int*)a;
	int* pb = (int*)b;
	cout << "pa地址:" << &pa << endl;
	cout << "pb地址:" << &pb << endl;
	return *pa - *pb;
}

int main() {
	// 函数有没有地址?
	int(*ptr)(const void*, const void*) = &compare_int;
	int x = 10, y = 20;
	//函数指针有两种调用方式
	//1.解引用方式调用
	(*ptr)(&x, &y);
	//2.直接调用
	ptr(&x, &y);
	return 0;
}

上面这个是函数指针和void*指针的应用

#include <iostream>
#include <string>
using namespace std;

int compare_int(const void* a, const void* b) {
	int* pa = (int*)a;
	int* pb = (int*)b;
	return *pa - *pb;
}

int main() {
	// 函数有没有地址?
	int arr[12] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 11, 12 };
	int(*ptr)(const void*, const void*) = &compare_int;
	int x = 10, y = 20;
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), ptr);
	cout << "After sorting: ";
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
		cout << arr[i] << " ";
	}
	return 0;
}

qsort也可以对char数组进行排序

#include <iostream>
#include <string>
using namespace std;

int compare_int(const void* a, const void* b) {
	int* pa = (int*)a;
	int* pb = (int*)b;
	return *pa - *pb;
}

int compare_char(const void* a, const void* b) {
	char* pa = (char*)a;
	char* pb = (char*)b;
	return *pa - *pb;
}

int main() {
	// 函数有没有地址?
	char charArray[] = "asodifoadfjdvn";
	int(*pCompare)(const void*, const void*) = &compare_char;
	qsort(charArray, sizeof(charArray) / sizeof(char), sizeof(char), pCompare);
	for (int i = 0; i < sizeof(charArray) / sizeof(char); i++) {
		cout << charArray[i];
	}
	return 0;
}

标签:char,p1,const,int,void,十六,C++,路线,input
From: https://blog.csdn.net/weixin_45169583/article/details/142936009

相关文章

  • C++学习路线(十四)
    指针的自增操作查看数组与指针的关系#include<iostream>usingnamespacestd;intmain(){ intages[]={18,20,22,25,28}; intlen=sizeof(ages)/sizeof(ages[0]); cout<<"使用数组的方式访问元素"<<endl; for(inti=0;i<len;i++){ co......
  • C++学习路线(十五)
    多级指针#include<iostream>usingnamespacestd;intmain(){ intblock1=888; int*block2=&block1; int**block3=&block2; int***block4=&block3; int****block5=&block4; cout<<"block2:"<<*block2......
  • Ubuntu中VSCode配置CC++环境
    我的环境:Ubuntu22.04.5LTSVSCode版本:1.94.2参考文章:https://blog.csdn.net/zimuzi2019/article/details/106861692https://zhuanlan.zhihu.com/p/147366852一、安装gcc/g++和gdbsudoapt-getupdatesudoapt-getinstallgccsudoapt-getinstallg++sudoa......
  • day03(C++)信号槽
    目录1.概念2.函数原型3.连接方式3.1自带信号→自带槽3.2自带信号→自定义槽3.3自定义信号4.信号槽传参5.对应关系5.1一对多5.2多对一信号槽1.概念之前的程序界面只能看,不能交互,信号槽可以让界面进行人机交互。信号槽是Qt在C++基础上新增的......
  • RBE104TC C/C++ Programming Language
    RBE104TCC/C++ProgrammingLanguageAssignment1ContributiontotheOverallMarks30%IssueDateSubmissionDeadline13thOctober2024AssignmentOverview:ThisassignmentisgearedtowardsassessingfundamentalcodingconceptsinC/C++andinitiatingthep......
  • c++基础语法知识
    基础当VS中一个项目下有两个及以上的源文件时,编译会产生错误:main已经在test.obj中定义;找到一个或多个多重定义的符号。**解决办法:**将不需要编译的源文件排除:右键“属性”,将“从生成中排除”选择“是”,保存后再运行需要运行的源文件就可以成功,且被排除的文件右下角有红标......
  • C++面试速通宝典——27
    504.孤儿进程和僵尸进程是什么?怎么处理?孤儿进程:当一个父进程结束,而他的一个或多个子进程还在运行时,那些子进程将成为孤儿进程。孤儿进程会被init进程(进程ID为1)自动领养,init进程会负责调用wait()来收集他们的退出状态。僵尸进程:当一个子进程结束,在其父进程没有调用wait()......
  • C++试题带答案
    一、选择填空题1.有如下定义structperson{char name[9];intage;};person  pr[10]={"Johu",17,"Paul",19,"Mary",18,"Adam",16};根据上述定义,能输出字母M的语句是     A)cout<<pr[3].mane;          B)cout<<pr[3].name[1];C......
  • 【C++指南】C++中的浅拷贝与深拷贝:深入剖析
              ......
  • 网络安全系统教程+渗透测试+学习路线(自学笔记)_渗透测试工程师怎么自学
    一、什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也......