一、指針基本操作
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列數組