(二)C语言基础(指针)

时间:2022-07-17 01:44:57

五、指针

1. 基础

  • 数据存储结构:内存地址 <===> 实际值
  • 一个指针变量其内存中实际值为一个地址;当然,它还有自己的地址
  • 定义一级指针变量 : int*
  • 引用指针指向变量 : *int
  • 取变量地址 : &i
#include<stdio.h>
#include<stdlib.h>
/*
指针就是内存地址
内存地址就是指针 
*/

main(){
    int i=10;
    //定义一个int类型的一级指针变量p,指针变量保存的值为一个int变量的地址 
    int* p;
    //把i的地址赋给p 
    p = &i;

    //指针取值 *p,把p指针指向的变量取出 
    printf("*p==%d\n",*p); //p==10
    //也可以直接赋值
    *p = 100;
    printf("*p==%d\n",*p);//p==100

    system("pause");
} 

2.1 例子 - 交换两个变量

step 1 : 正常交换两个是正常的,见如下代码被注释部分。
step 2 : 使用此swap(int i,int j)方法,结果如下:

before i = 100
before j = 200
main &i = 0x62fe4c
main &j = 0x62fe48
swap &i = 0x62fe20
swap &j = 0x62fe28
after i = 100
after j = 200

在swap函数中新建了内存空间,初步分析c语言为值传递机制。
step 3 : 使用指针方法swap_use_pointer(&i , &j),之后的输出结果如下:

before i = 100
before j = 200
main &i = 0x9ffe4c
main &j = 0x9ffe48
swap_use_pointer &i = 0x9ffe4c
swap_use_pointer &j = 0x9ffe48
after i = 200
after j = 100

结果分析:
C语言参数传递为值传递,与Java相同。

相关源码如下:

#include<stdio.h>
#include<stdlib.h>

void swap(int i,int j){
    int swap;
    swap=i;
    i=j;
    j=swap;
    printf("swap &i = %#x\n",&i);
    printf("swap &j = %#x\n",&j);
}

void swap_use_pointer(int* i,int* j){
    int swap;
    swap=*i;
    *i=*j;
    *j=swap;
    printf("swap_use_pointer &i = %#x\n",i);
    printf("swap_use_pointer &j = %#x\n",j);
}

main(){
    int i=100;
    int j=200;
    printf("before i = %d\n",i);
    printf("before j = %d\n",j);
    printf("main &i = %#x\n",&i);
    printf("main &j = %#x\n",&j);
    /* step1 int swap; swap=i; i=j; j=swap; */

    //swap(i,j); //step2

    swap_use_pointer(&i , &j);//step3

    printf("after i = %d\n",i);
    printf("after j = %d\n",j);

    system("pause");
} 

2.2 例子 - 返回多个值(一个以上)

由于传入地址,类似于Java中的传入对象的引用,所以可以直接操控多个变量,从而可以不用使用return。

#include<stdio.h>
#include<stdlib.h>

//返回多个值 
handle(int* a, int* b){
    *a=0;
    *b=0;
}

main(){ 
    int a=1;
    int b=1;

    handle(&a,&b);
    printf("a=%d\n",a); 
    printf("b=%d\n",b); 
    system("pause");
} 

2.3 例子 - 指针的长度

  • 32位系统中指针的长度为4
  • 64位系统中指针的长度为8
#include<stdio.h>
#include<stdlib.h>

main(){
    int* iPoint;
    char* cPoint; 

    printf("iPoint的长度 = %d\n",sizeof(iPoint));//8
    printf("cPoint的长度 = %d\n",sizeof(cPoint));//8
    system("pause");
} 

3. 多级指针

  • 定义:int**
  • 取值:**a
#include<stdio.h>
#include<stdlib.h>

/* 多级指针:以int类型为例 */ 

main(){ 
    //定义一个int类型的变量a,赋值为100
    int a=100;
    //定义一个一级指针
    int* addr1 = &a;

    //定义多级指针 
    //定义一个二级指针 
    int** addr2 = &addr1;
    //定义一个三级指针,以此类推 
    int*** addr3 = &addr2;

    //多级指针取值
    printf("***a = %d\n",***addr3);// ***a = 100

    //多级指针赋值
    ***addr3 = 200;
    printf("a = %d\n",a);//a = 200 
    system("pause");
}