前
以前没学过 学起来感觉挺吃力的
查了很多资料 终于算是大概明白了
肝了几个小时吧 感觉明白一点了
不想单独写博客 比较麻烦 就边写代码边注释的
还会有更新的 直接上目前的代码吧。
中
建议复制下来在编译器运行看看
还建议看看宏定义……
#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 = ⅈ char* pc = &cc; double* pd = ⅆ //指针指向变量
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];
}
后
好了就这样吧 有错误欢迎指点 期待下次更新