指針及動態申請內存

一、指針基本操作

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列數組
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章