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;
}
相关推荐
森焱森6 小时前
一文理解锂电池充电、过放修复与电量测量:从原理到实战
c语言·单片机·架构
艾莉丝努力练剑6 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(五)
c语言·开发语言·数据结构·学习·算法
XH华7 小时前
C语言第一章数据类型和变量(上)
c语言·开发语言
暗影~行星7 小时前
C语言,结构体指针案例
c语言·开发语言
(Charon)7 小时前
C语言手写简易 DNS 客户端(接收部分)
c语言·开发语言
秋说9 小时前
【PTA数据结构 | C语言版】后缀表达式求值
c语言·数据结构·算法
乌萨奇也要立志学C++10 小时前
【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序
c语言
basketball61620 小时前
Linux C 管道文件操作
linux·运维·c语言
ydm_ymz20 小时前
C语言初阶4-数组
c语言·开发语言
灵哎惹,凌沃敏1 天前
C语言/Keil的register修饰符
c语言·开发语言