6.13 c语言

十.指针

10.1 指针基本用法

程序简洁,紧凑,高效

有效的表达复杂的数据结构

动态分配内存

得到多余一个的函数返回值

计算机内存中,每一个字节单元都有一个编号,称为地址

编译或函数调用时为其分配内存单元

10.2 指针的概念

内存单元的地址称为指针,用来存放地址的变量。(地址==指针)

<数据类型> *<指针变量名>

指针变量是个变量

char *pname;

c 复制代码
#include <stdio.h>
#include<stdlib.h>
int main()
{
    int a = 10;
    int *pa;
    pa = &a;
    printf("a = %p pa = %p pa = %d %p\n",&a,pa,*pa,&pa);
    return 0;
}

10.3 指针的含义

指针指向的内存区域中的数据称为指针的目标

如果它指向的区域是程序的一个变量的内存空间,则这个变量称为指针的目标变量,简称为指针的目标

px,指针变量,它的内容是地址量

*px,指针所指向的对象,它的内容是数据

&px,指针变量占用的存储区域的地址,是一个常量

指针的赋值运算指的是通过赋值运算符指针变量送一个地址值

向一个指针变量赋值时,送的值必须是地址常量或指针变量

什么是指针?指针是内存单元的地址

指针有多少字节?8个

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a = 10;
    int *pa,*pb,*pc;
    int c[10];
    pa = &a;
    pb = pa;
    pc = &c[0];
    printf("a = %p\n pa = %p\n pb = %p\n pc = %p",&a,pa,pb,pc);
    return 0;
}

10.4 指针运算

指针运算是以指针变量所存放的地址量作为运算量而进行的运算

指针运算的实质就是地址的计算

指针运算的种类是有限的,它只能进行赋值运算、算数运算和关系运算。

两个指针相减运算

px-py运算的结果是两个指针指向的地址位置之间相隔数据的个数

两个指针相减的结果值不是地址量,而是一个整数值,表示两指针之间相隔数据的个数

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[10] = {1,2,3,4,5};
    int *pa,*pb;
    pa = &a[3];
    printf("pa = %d\n",*pa);
    pb = pa++;
    printf("pa = %d pb = %d\n",*pa,*pb);
    pb = pa-2;
    printf("pa = %d pb = %d",*pa,*pb);
    return 0;
}
c 复制代码
#include <stdio.h>
#include<stdlib.h>
int main()
{
    int a[5] = {1,2,3,4,5};
    int *pa,*pb;
    pa = a;
    printf("pa =%d\n",*pa);
    pb = pa++;//pa先赋值给pb,再自增
    printf("pb = %d,pa = %d\n",*pb,*pa);
    return 0;
}
c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[] = {1,2,3,4,5};
    int *pa;
    pa = &a[2];
    pa++;
    printf("%d ",pa[1]);
    return 0;
}

10.5 指针和数组

数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元素在内存中的起始地址

一维数组的数组名为一维数组的指针

本质不同:指针变量是地址变量,数组的指针是地址常量//常量不能自增,a++ = a+1,a-- = a-1;

c 复制代码
#include <stdio.h>
#include<stdlib.h>
int main()
{
    int a[] = {1,2,3,4,5};
    int i,n,*p;
    p = a;
    n = sizeof(a)/sizeof(int);
    for(i=0;i<n;i++)
    {
        printf("%d %d %d %d\n",a[i],*(p+i),p[i],*(a+i));
    }
    return 0;
}

数组元素反序

c 复制代码
#include <stdio.h>
#include<stdlib.h>
int main()
{
    int a[] = {1,2,3,4,5};
    int *p1,*p2,n,i,t;
    n = sizeof(a)/sizeof(int);
    p1 = a;
    p2 = &a[n-1];//指针变量存放地址
    while(p1<p2)
    {
        t = *p1;
        *p1 = *p2;
        *p2 = t;
        p2--;
        p1++;
    }
    for(i=0;i<n;i++)
    {
        printf("%d",a[i]);
    }
    return 0;
}
相关推荐
炸膛坦客5 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
程序员Rock13 小时前
上位机开发-MODBUS面试常见问题
c语言·c++·面试·职场和发展·上位机
blevoice18 小时前
抖抖燃脂机单 AC6966B 主控调试踩坑:Type-C 整机供电喇叭无声排障
c语言·开发语言·单片机
小小晓.18 小时前
C++小白记:C风格字符串和数组用法
c语言·开发语言·c++
深念Y19 小时前
开发者如何清理和迁移C盘堆积的垃圾
c语言·开发语言
十月的皮皮19 小时前
STM32从零到量产开发:四路继电器工业控制模块开发实战笔记(小白视角)
c语言·笔记·stm32·stm32cubemx·hal库
不正经学生19 小时前
C 语言函数深入剖析(基础篇)—— 从零理解函数的每一个细节
c语言·开发语言·数据结构·算法·c#
天空'之城21 小时前
C 语言工业级通用组件手写 10:字节序转换
c语言·字节序·大小端·嵌入式通信·工业级组件
C++ 老炮儿的技术栈1 天前
OpenCV 实现社保卡透视矫正:Hough 直线提取四角并转正证件图像
c语言·c++·人工智能·opencv·算法·计算机视觉·c
我叫洋洋1 天前
C ++ [ hello world ]
c语言·c++·算法