一、指针基本操作
1、定义和初始化
int *p = NULL;//int,char,long long,double都行
/**************************************************/
int a;
int *p = &a;
/**************************************************/
int a;
int *p = NULL;
*p = a;
2、指针的swap
void Swap(int *p, int *q)
{
int tmp;
tmp = *p;
*p = *q;
*q = tmp;
}
int main()
{
int a = 1, b = 2;
Swap(&a, &b);
return 0;
}
二、指针和一维数组的关系
1、定义和初始化
int num[105];
int *p = num;
/**************************************************/
int num[105];
int *p = NULL;
p = num;
/**************************************************/
*(p+n) = a[n];
p+n = &a[n];
2、用指针遍历一维数组
int num[105], n;
int *p = num;
while (cin >> n)
{
for (p = num + 1; p <= (num + n); p++)
scanf("%d", p);
for (p = num + 1; p <= (num + n); p++)
printf("%d ", *p);
}
3、调用函数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int add(int *p, int n)
{
int re = 0;
for (int i = 1; i <= n; i++)
re += *(p + i);//p[i]
return re;
}
int main()
{
ios::sync_with_stdio(false);
int num[105], n;
int *p = num;
while (cin >> n)
{
for (p = num + 1; p <= (num + n); p++)
scanf("%d", p);
cout << add(num, n) << endl;
}
return 0;
}
三、指针和二维数组
1、基本关系
int num[10][10];
//第i行的地址
num + i;
num[i];
//第i行0列的地址
*(num + i);
//第i行j列的地址,
*(num + i) + j;
num[i] + j;
&num[i][j];
//第i行第j列的内容
*(*(num + i) + j);
num[i][j];
//指向数组的指针
(*p)[n]//n是数组的列数
//指针数组
*p[n]//n是数组的行数
2、行指针
①基本操作:
int a[5][3];
int(*p)[3]; //定义行指针,p是一个指向数组的指针,此数组有3个int类型的元素
p = a; //用行地址进行初始化
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
cout << *(*(p + i) + j) << endl;
②函数中应用行指针:
void solve(int (*p)[3])//注意数组的列数
{
}
solve(a); //传入的是二维数组的行地址
3、列指针
①基本操作:
int a[5][3];
int *p;
p = *a; //用列地址进行初始化,等价于p = a[0];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cout << *(p + i * k + j) << endl; //这里的k指的是你定义的数组的列数,在本测试中k = 3,等价于p[i*k+j]
②函数中应用列指针:
void solve(int *p)//列指针
{
}
solve(*a);//传入数组的列地址
4、指针与字符串
①基本操作:
char s[20][100]; //定义
char *p[20]; //定义一个指针数组,里面存放着20个char*类型的数据
for (int i = 1; i = 20; i++)
{
p[i] = s[i];
cin >> s[i];
}
for (int i = 1; i <= 20; i++)
cout << p[i] << endl;
②函数中应用字符串指针
void solve(char(*p)[20])
{
}
char s[5][20];
solve(s); //传入行地址
void solve(char *p[5])
{
}
char s[5][20];
char *p[5]; //定义指针数组,指向字符串的每一行的首地址
for (int i = 1; i <= 5; i++)
p[i] = s[i];
solve(p);
③字符串排序
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = n; i >= a; i--)
const double PI = acos(-1.0);
void Swap(char *x, char *y) //交换函数
{
char a[20];
strcpy(a, x);
strcpy(x, y);
strcpy(y, a);
}
void solve(char *p[5])
{
char *tmp;
for (int i = 1; i <= 5; i++)
{
tmp = p[i];
for (int j = i + 1; j <= 5; j++)
tmp = (strcmp(tmp, p[j]) > 0) ? p[j] : tmp;
Swap(tmp, p[i]);
}
}
int main()
{
ios::sync_with_stdio(false);
char s[5][20];
char *p[5]; //定义指针数组,指向字符串的每一行的首地址,用来代替字符串进行操作
for (int i = 1; i <= 5; i++)//指针的初始化
p[i] = s[i];
for (int i = 1; i <= 5; i++)
cin >> s[i];
solve(p);
for (int i = 1; i <= 5; i++)
cout << s[i] << endl;
return 0;
}
四、动态申请内存
1、基本操作
void *malloc(unsigned int size); //申请size大小的内存
void *calloc(unsigned int num, unsigned int size); //申请num个size大小的内存
void *free(void *p); //释放内存
2、malloc申请内存的使用
int *p = (int *)malloc(100 * sizeof(int)); //申请100个int类型的内存,相当于p为100的一维数组
/**************************************************/
int *p[n];
for (int i = 1; i <= n; i++)
p[i] = (int *)malloc(100 * sizeof(int)); //常用于字符串数组的操作
3、calloc申请内存的使用
int *p = (int *)calloc(m * n, sizeof(int)); //二维数组列指针,m行n列数组