什么是指针

  1. 指针是内存中一个最小单元的编号,也就是地址
  2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量

指针变量

我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个
变量就是指针变量

#include <stdio.h>
int main() {
    printf("%d\n",sizeof(char *));//结果位8因为我的计算机是64位操作系统
    printf("%d\n",sizeof(short *));
    printf("%d\n",sizeof(int *));
    printf("%d\n",sizeof(double *));
    return 0;
}

指针和指针类型

char  *pc = NULL;
int   *pi = NULL;
short *ps = NULL;
long  *pl = NULL;
float *pf = NULL;
double *pd = NULL;

char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节

指针做加法

#include <stdio.h>
int main() {
    int n = 10;
    int * pn = &n;//传递地址然后进行加法操作
    *pn = *pn+1;
    printf("%d\n",n);
}

指针的解引用

#include <stdio.h>
int main() {
    int arr[10]={0};
    int * parr = arr;
    for (int i=0;i<10;i++){
        parr[i]=i+1;
    }
    for(int j=0;j<10;j++){
        printf("%d\n",arr[j]);
    }
}

野指针

#include <stdio.h>
 
int main()
{                //这里p为野指针
  int* p;  //p是一个局部变量(在{}里的变量为局部变量),局部变量不初始化默认是随机值。
  *p = 10;  //非法访问内存。
 
return 0;
}

数组名其实就是一个指针

#include<stdio.h>
int main(){
    int arr[10]={0};
    int * parr = arr;//将数组传递给一个指针变量

    for(int i=0;i<10;i++){
        parr[i]=i+1;
    }
    for(int j=0;j<10;j++){
        printf("%d\n",arr[j]);
    }
    return 0;
}

换种写法而已

#include <stdio.h>
int main(){

    int arr[10]={};
    int * p=arr;
    for (int i=0;i<10;i++){
        *(p+i)=i+1;//另外一种写法而已
    }
    for(int j=0;j<10;j++){
        printf("%d\n",arr[j]);
    }

    return 0;
}

字符指针

#include <stdio.h>
int main(){
    char ch = 'q';
    char *pc = &ch;
    *pc = 'w';
    printf("%c\n",ch);
    return 0;
}

字符指针使用和遍历

#include <stdio.h>
#include<string.h>
int main(){
    char * str = "sdfsfdsfsd";
    int strLen = strlen(str);
    for (int j=0;j<strLen;j++){
        printf("%c\n",str[j]);
    }
}

函数操作

一维数组作为参数传递-必须有数组大小

void test(int arr[],int size){
    for(int i=0;i<size;i++){
        printf("%d\n",arr[i]);
    }
}
int main(){
    int arr[]={1,2,3,4,5,6,9};
    int size = sizeof(arr)/sizeof(arr[0]);
    test(arr,size);
}

二维数组传参

#include <stdio.h>
#include<string.h>

void test(int (*arr)[3]){
    for(int i=0;i<2;i++){
        for(int j=0;j<3;j++){
            printf("j=%d\t",arr[i][j]);
        }
        printf("%\n");
    }
}
int main(){
    int arr[2][3]={{1,2,3},{4,5,6}};//二维数组第一维度里面其实就是地址

    test(arr);
}

三维数组传递

#include <stdio.h>
void test( int (*arr)[2][2]){//三维数组传递
    for (int i=0;i<3;i++){
        for(int j=0;j<2;j++){
            for(int m=0;m<2;m++){
                printf("%d\n",arr[i][j][m]);
            }
        }
    }
}
int main(){
    int arr[3][2][2]={{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}};
    test(arr);
    return 0;
}
如果多为数组类似传递

数组使用指针作为函数参数传递

函数传递使用一级指针大小需要传递

#include <stdio.h>
#include<string.h>
void test1(int * arr){
    for(int j=0;j<10;j++){
        printf("%d\n",arr[j]);
    }
}
int main(){
    int arr[10]={0};
    for(int i=0;i<10;i++){
        arr[i]=i+1;
    }
    test1(arr);
}