C语言集训-第五次作业-谢世轩

136 阅读4分钟

指针

  • 什么是指针

例子

#include<stdio.h>
int main()
{
    int * p;//p是变量的名字,int *表示的是p存放的是int类型的地址
    int i = 3;
    
    p = &i;//表示p保存了i的地址,且p指向i,但p不是i所以修改i不影响p
    
    return 0;
}
1.指针就是地址,地址就是指针,

2.地址是储存内存单元的编号

3.指针变量是存放地址的变量

4.指针只是一个值(内存单元的编号)、一个编号

5.指针变量和指针是两个不同的概念

6.指针的本质是一个操作受限的非负整数

指针的重要性

1.表示一些复杂的数据结构

2.快速的传递数据

3.是函数返回一个以上的值

4.能直接访问硬件

5.能够方便的处理字符串

6.是理解面向对象语言中引用的基础

什么是内存

1.从零开始的非负整数

2.内存单元的编号

指针常见错误

# include<stdio.h>
int main()
{
    int i = 5;
    int * p;
    int * q;
    
    p = &i;
    //*q = p;错误
    //*q = *p;错误
    
    p = q;//q是垃圾值,q付给p,p也变垃圾值
    
    printf("%d\n",*q);//q内部是垃圾值则会出错因为本程序没有*q此时所代表的内存单元的控制权限
    return 0;
}

指针经典程序

#include <stdio.h>
void exchange(int *p, int *q)
{
    int t;

    t = *q;
    *q = *p;
    * p = t;
}
int main()
{
    int a = 5;
    int b = 3;
    exchange(&a, &b);
    printf("a=%d b=%d", a, b);
    return 0;
}

指针互换数字.cpp - Visual Studio Code 2021_12_5 21_35_29.png

星号的含义

1.乘法

2.定义指针

3.间接运算符(指针运算符)

  • 如果p已经是一个指针变量则*p表示的是以p的内容为地址的变量

一维数组和指针的关系

1.一维数组名是个指针常量存放的是一维数组第一个元素的地址

一个函数要处理一维数组需要处理该数组的哪些信息,即确定一个一维数组要几个参数

  • 需要数组名和元素个数

一个指针变量占几个字节

#include <stdio.h>
int main()
{
    char ch = 'a';
    int c = 34;
    double d = 78;

    char *e = &ch;
    int *r = &c;
    double * t = &d;
    printf("%d %d %d", sizeof(e), sizeof(r), sizeof(t));

    return 0;
}
/* 指针变量占几个字节?
 指针即为地址,指针几个字节跟语言无关,而是跟系统的寻址能力有关,以前是16为地址,指针即为2个字节,32位系统,所以是4个字节,现在64位,则就为8个字节。
 -------------
输出结果
   8 8 8
 -------------
*/

动态内存分配

传统数组的缺点

1.数组长度必须事先制定,且只是常整数

2.传统数组的内存程序员无法手动释放在一个函数运行期间,系统为该函数分配的空间会一直被占用直到该函数运行完毕

3.数组的长度一旦定义就不能在更改

4.A函数定义的数组,在A函数运行期间可以被其他函数使用但当A函数结束后便不能使用

5.传统数组不能跨函数运行

为什么需要动态内存分配

动态数组很好解决了以上的问题

传统数组叫做静态数组

1.malloc函数只能返回第一个字节的地址

2.malloc只有一个形参,且为整型

3.int * p=(int *)malloc(4)分配了八个字节

动态内存和静态内存的比较

1.静态内存是是系统自动分配,由系统自动释放

2.静态内存是在栈分配的

3.动态内存是程序员手动分配,手动释放

4.动态内存是在堆分配的

动态内存举例

#include <stdio.h>
#include <malloc.h>

int main()
{
    int len;
    int *t;
    int i;

    printf("plase write down your number\n");
    scanf("%d", &len);
    t = (int *)malloc(4 * len);

    for (i = 0; i < len; ++i)
        scanf ("%d", &t[i]);

    for (i = 0; i < len; ++i)
        printf ("%d ", t[i]);
    return 0;
}

课后习题

10.12.1
#include <stdio.h>
int main(void)
{
    int ref[] = { 8,4,0,2};
    int *ptr;
    int index;

    for(index = 0,ptr = ref;index < 4;index++,ptr++)
        printf("%d %d\n",ref[index],*ptr);
    
    return 0;
}
/*
输出结果为
---------
8 8
4 4
0 0
2 2
---------
*/

10.12.2

ref中有四个元素

10.12.3

ref地址就是是ref[0]的地址,ref + 1表示 ref[1]的地址,++ref无指向

10.12.4

a

ptr 值是12

*(ptr + 2)的值是16

b

ptr 值是12

*(ptr + 2)的值是1

10.12.5

a

**ptr的值是12

**(ptr+1)是16

b

ptr的值是12

*(ptr+1)是14