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;
}
相关推荐
EricWang13581 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
我是谁??1 小时前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
希言JY2 小时前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言
午言若2 小时前
C语言比较两个字符串是否相同
c语言
TeYiToKu3 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
互联网打工人no14 小时前
每日一题——第一百二十四题
c语言
爱吃生蚝的于勒4 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~4 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
洋2404 小时前
C语言常用标准库函数
c语言·开发语言
徐嵌5 小时前
STM32项目---畜牧定位器
c语言·stm32·单片机·物联网·iot