指针基础

指针和数组(上)

专题四:指针和数组(上)。包括以下章节:

  • 指针基础
  • 数组基础
  • 数组与指针分析
  • C语言中的字符串

变量回顾

  • 变量是一段存储空间的别名,那么访问这段空间必须使用这个别名吗?
int main()
{
    int i = 6;
    int* p = &i;

    //结果:6, BFC1C3BC
    printf("%d, %08X\n", i, p);

    //通过*运算也可以修改i的值。(相当于i=10)
    *p = 10;

    //结果:10, BFC1C3BC
    printf("%d, %08X\n", i, p);

    return 0;
}

指针本质

  • 指针在本质上也是一个变量
  • 指针需要占用一定的内存空间
  • 指针保存的是内存地址的值
  • 问题:不同类型的指针占用的内存空间的大小是否相同?
#include<stdio.h>

int main()
{
    int* pi;
    char* pc;
    long* pl;
    double* pd;
    float* pf;

     //打印结果都是8
     //64位系统,指针占8个字节;而32位系统,指针变量占用4个字节
     //结论:1,因为指针必须有能力保存所有内存地址的值,(同一机器)不同类型的指针占用的内存空间大小相同
     //2,因为不同的机器地址总线不同(32位、64位),所以不同机器上指针占用内存空间大小不同
     printf("%lu\n", sizeof(pi));
     printf("%lu\n", sizeof(pc));
     printf("%lu\n", sizeof(pl));
     printf("%lu\n", sizeof(pd));
     printf("%lu\n", sizeof(pf));

     return 0;
}

结果:
这里写图片描述

*号的意义

  • 在指针声明时,*号表示所声明的变量为指针
  • 在指针使用时,*号表示取指针所指向的内存空间中的值
  • *号类似一把钥匙,通过这把钥匙可以 打开内存,读取内存中的值。
//指针声明:
int i = 0;
int* p = &i;

//取值
int j = *p;

实例分析1-1

1-2.c

#include <stdio.h>

int main()
{
    int i;
    int* pI;
    char* pC;
    float* pF;

    pI = &i;
    *pI = 10;

    printf("%0X, %0X, %d\n", (unsigned int)(long)pI, (unsigned int)(long)&i, i);
    printf("%lu, %lu, %0X\n", sizeof(int*), sizeof(pI), (unsigned int)(long)&pI);
    printf("%lu, %lu, %0X\n", sizeof(char*), sizeof(pC), (unsigned int)(long)&pC);
    printf("%lu, %lu, %0X\n", sizeof(float*), sizeof(pF), (unsigned int)(long)&pF);

    return 0;
}

结果:
这里写图片描述

传值调用与传址调用

  • 指针是变量,因此她可以作为函数的参数使用
  • 当一个函数体内部需要改变函数外部的值,则需要使用指针参数
  • 指针适用于复杂数据类型作为参数的函数中

传值调用和传址调用示例

#include<stdio.h>
//传值调用:传形参,不会改变函数外部的值
void f1(int a, int b)
{
    a = 2;
    b = 3;
}
//传址调用:传内存地址,通过*运算取值,可以改变函数外部的值
void f2(int* pa, int* pb)
{
    *pa = 2;
    *pb = 3;
}

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

    f1(a,b);
    printf("%d, %d\n", a, b);//a = 0, b = 0

    f2(&a, &b);
    printf("%d, %d\n", a, b);//a = 2, b = 3

    return 0;
}

手把手教你写代码:利用指针实现变量交换函数

#include<stdio.h>

#define SWAP(a,b) do{ int tmp = a; a = b; b = tmp; }while(0)

void swap1(int a, int b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

void swap2(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main()
{
    int a = 5;
    int b = 8;

    swap1(a,b);//不会互换值。在调用函数时,函数自己创建栈变量,与外部a、b没关系
    printf("%d, %d\n", a, b);

    swap2(*a,*b);
    printf("%d, %d\n", a, b);

    a = 5;
    b = 8; 
    SWAP(a,b);//会互换值。在预编译期直接替换代码,互换的是我们定义的a和b
    printf("%d, %d\n", a, b);


    return 0;
}

常量与指针

  • const int* p //p可变,p指向的内容不变
  • int const* p //p可变,p指向的内容不变
  • int* const p//p不变,p指向的内容可变
  • const int* const p //p和p指向的内容都不可改变

  • 左数右指//const在左边,数据(指针指向的内容)不变;const在右边,指针(p的值)不变

小结

  • 指针是C语言中一种特别的变量
  • 指针所保存的值是内存的地址
  • 可以通过指针修改内存中的任意地址内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值