[学习]C++指针

以前没学过 学起来感觉挺吃力的

查了很多资料 终于算是大概明白了

肝了几个小时吧 感觉明白一点了

不想单独写博客 比较麻烦 就边写代码边注释的

还会有更新的 直接上目前的代码吧。

建议复制下来在编译器运行看看

还建议看看宏定义……

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
#include<algorithm> 
#include<cmath>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
#define PI acos(-1)
#define fin freopen("data.txt","r",stdin)
#define INF 2147483647
#define eps 1e-7
#define L 100005
#define Fo(i,a,b) for(LL i=(a),_=(b); i<=_; i++)
#define Ro(i,b,a) for(LL i=(b),_=(a); i>=_; i--)
#define Ms(a,b) memset((a),(b),sizeof(a))
#define _ceil(_,__) (_+(__-1))/__
#define debug(_) cout<<endl<<"d::"<<_<<endl<<endl
#define type(_) typeid(_).name()
inline LL read() {
    
    
	LL x = 0, f = 1;char c = getchar();
	while (!isdigit(c)) {
    
     if (c == '-')f = -f;c = getchar(); }
	while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48ll), c = getchar();
	return x * f;
}
void sol1(int* x, int y);
void sol2(int* x, int y[], int n);
void sol3(int* x, int y[][2]);


int main() {
    
    
	// &和*为互逆操作
	// * 可以理解为 取值符号 与[]功能类似均为取值
	// 数组名本身就是地址,所以无需 取地址符 &
	// 若指向变量则需取地址符
	cout << "--------------------------" << endl << "--------------------------" << endl << endl;

	int ii = 20; char cc = 'A'; double dd = 3.14;	//指针的概念
	int* pi = &ii; char* pc = &cc; double* pd = &dd;	//指针指向变量
	printf("%d %d %p %c %c %p %lf %lf %p\n", ii,*pi,pi, cc,*pc,pc, dd,*pd,pd);
	*pi = 10; *pc = 'B'; *pd = 2.71;	//指针指向变量修改
	printf("%d %d %p %c %c %p %lf %lf %p\n", ii, *pi, pi, cc, *pc, pc, dd, *pd, pd);

	cout << endl << "--------------------------" << endl << "--------------------------" << endl << endl;

	//数组指针与指针数组
	int* p1[5]; //指针数组:这是一个包含5个int类型指针的数组(一个数组)
	int(*p2)[5]; //数组指针:这是一个指向包含5个int类型数组的指针(一个指针)
	int u1 = 10 , u2[5] = {
    
     1,2,3,4,5 };


	cout << "p1::" << endl << endl;
	p1[0] = &u1;

	cout << &u1 << endl; //输出u1的地址
	cout << p1 << " " << p1 + 0<<" "<<&p1[0] << endl; //输出的是指针数组p1的地址 与 指针数组p1中第1个元素的地址 二者相等
	cout <<*p1<<" "<< *(p1 + 0) << " " << p1[0] << endl;  //输出均为p1[0]的数值即地址
	cout << **(p1+0)<<" "<<*p1[0] << endl; //输出为p1[0]所指向的值
	cout << **p1 << endl; //上面两步的合并做法
	cout << endl;

	Fo(i, 0, 4) {
    
     //令指针数组p1中的每个指针对应指向u2
		p1[i] = &u2[i];
	}
	//以下4个for循环输出做对比
	Fo(i, 0, 4) {
    
     //输出 指针数组p1里每个元素的地址
		cout << &p1[i] << " ";
	}
	cout << endl;
	Fo(i, 0, 4) {
    
     //输出 指针数组p1里每个元素的值
		cout << p1[i] << " ";
	}
	cout << endl;
	Fo(i, 0, 4) {
    
     //输出 数组u2里每个元素的地址
		cout << &u2[i] << " ";
	}
	cout << endl;
	Fo(i, 0, 4) {
    
     //输出 数组u2里每个元素的值
		cout << u2[i] << " ";
	}
	cout << endl;
	//以下的p1[0]其实都能看作一个普通的指针p 与指针数组的关系不大了
	cout << p1 << " " << (p1 + 0) << endl; //指向指针数组p1的第1个元素p[0](指针)的指针 即指针数组p1的地址 也为指针数组第1个元素p1[0]的地址
	cout << p1[0]  << " " << *(p1 + 0) << endl; //指针数组p1的第1个元素p[0]指向的元素(本题为u2的第1个元素)的地址
	cout << *p1[0] <<" "<<**(p1+0)<< endl; //指针数组的第1个元素指向的元素(本题为u2的第1个元素,不是地址)
	cout << endl;
	p1[0] = u2;
	cout << p1[0] <<" "<<*p1[0]<< endl; //输出u2数组的第1个元素u2[0]的地址 和 u2[0]这个值
	cout << p1[0] + 1 <<" "<<*(p1[0]+1)<<endl;//加1就是指向u2的第2个元素 即u2[1] 带*输出这个元素的值

	cout << endl << "--------------------------" << endl << "--------------------------" << endl << endl;

	cout << "p2::" << endl << endl;
	int u3[5] = {
    
     1 , 2 , 3 , 4 , 5 };
	int* p3 = u3; //指针指向一维数组
	Fo(i, 0, 4) {
    
     //指针访问一维数组
		cout << *(p3 + i) << " ";
	}
	cout << endl<<endl;
	int u4[3][2] = {
    
     1,2,3,4,5,6, };
	int(*p4)[2] = u4; //指针指向二维数组(第一种)
	Fo(i, 0, 2) {
    
     //指针访问二维数组
		Fo(j, 0, 1)
			cout << *(*(p4 + i) + j) << " ";
		cout << endl;
	}
	cout << endl;
	int* p5[3];
	Fo(i, 0, 2)
		p5[i] = u4[i]; //指针指向二维数组(第二种)
	Fo(i, 0, 2) {
    
     //指针访问二维数组(第二种)
		Fo(j, 0, 1)
			cout << *(p5[i] + j) << " ";
		cout << endl;
	}

	cout << endl << "--------------------------" << endl << "--------------------------" << endl << endl;

	//对指针部分与数组相关
	int arr[5] = {
    
     1,2,3,4,5 };
	//arr &arr &arr[0] 只能用%p输出
	printf("%d %p\n", arr, arr); 
	printf("%d %p\n", &arr, &arr);
	printf("%d %p\n", &arr[0], &arr[0]);
	printf("%p %p %p\n", arr, &arr, &arr[0]);
	//cout默认用%p输出,即默认输出地址
	cout << arr << " " << &arr << " " << &arr[0] << endl;
	int* parr = arr;
	//int* parr0 = &arr; //错误:因为数组名本身就是地址
	int x1, x2, x3, x4, x5;
	//输出一维数组的地址
	int* parr1 = &arr[0]; int* parr2 = &arr[1]; int* parr3 = &arr[2]; int* parr4 = &arr[3]; int* parr5 = &arr[4];
	cout << parr << " " << parr1 << " " << parr2 << " " << parr3 << " " << parr4 << " " << parr5 << endl;
	//输出一维数组的地址的另一种写法
	parr1 = arr + 0; parr2 = arr + 1; parr3 = arr + 2; parr4 = arr + 3; parr5 = arr + 4;
	cout << parr << " " << parr1 << " " << parr2 << " " << parr3 << " " << parr4 << " " << parr5 << endl;
	//输出一维数组的值
	x1 = *(arr + 0); x2 = *(arr + 1); x3 = *(arr + 2); x4 = *(arr + 3); x5 = *(arr + 4);
	cout << x1 << " " << x2 << " " << x3 << " " << x4 << " " << x5 << endl;

	cout << endl << "--------------------------" << endl << "--------------------------" << endl << endl;

	//一维指针函数
	int a[] = {
    
     1, 2, 3,4,5 }, b[] = {
    
     6,7,8,9,10 };
	int c = 11 , d = 12;
	sol1(&c, d);
	cout << c << " " << d << endl;
	sol2(a, b, 4);
	Fo(i, 0, 4)
		cout << a[i] << " ";
	cout << endl;
	//二维指针函数
	int e[][2] = {
    
     {
    
    1,2},{
    
    3,4},{
    
    5,6} };
	int f[][2] = {
    
     {
    
    7,8},{
    
    9,10},{
    
    11,12} };
	Fo(i, 0, 2)
		sol2(e[i], f[i], 1); //e[i]是指针类型 f[i]是数组类型
	//上面也表明 写指针传递二维数组可以用指针传递一维数组来做
	Fo(i, 0, 2) {
    
    
		Fo(j, 0, 1)
			cout << e[i][j] << " ";
		cout << endl;
	}
	cout << endl << "--------------------------" << endl << "--------------------------" << endl << endl;
	return 0;
}

void _swap(int* x, int* y) {
    
     //很经典的例子
	int temp = *x;
	*x = *y;
	*x = temp;
}


void sol1(int* x, int y) {
    
    
	*x = y;
}

void sol2(int* x, int y[], int n) {
    
    
	Fo(i, 0, n)
		* (x + i) = y[i];
}

好了就这样吧 有错误欢迎指点 期待下次更新

猜你喜欢

转载自blog.csdn.net/cls1277/article/details/111659091
今日推荐