C语言集训---吴嘉乐---第五次作业

151 阅读4分钟

笔记

视频笔记

指针

  • c语言危险是因为指针可以直接访问内存
  • 地址即内存单元的编号,指针即地址
  • p是变量的名字,int*表示P变量是存放int类型变量的地址
  • p不是i,i也不是p,修改i的值不影响p的值,修改i的值也不影响p
  • 如果一个 指针变量指向某个普通变量,指针变量完全等同于普通变量 在第一次出现时指定义一个指针变量,后面出现的*是指针运算符,*P可以取所指向普通变量的值
int main()
{
    int *p;  //p是变量的名字,int*表示P变量是存放int类型变量的地址
    int i=3,j;
   // p=i;
   //p=55;
   p=&i;
   j=*p;
   printf("%d,%d",j,i);
    return 0;
}
  • 指针即是地址,地址即是变量,地址即是内存变量的编号
  • 指针变量和指针是两个不同的概念,但叙述是指针就是指针变量 指针的重要性
  • 表示一些复杂的数据结构
  • 快速的传输数据
  • 是函数返回提个以上的值
  • 能直接访问硬件
  • 能够方便的处理字符串
  • 指针是C语言的灵魂 什么是地址
  • 地址:内存单元的编号
  • CPU直接处理内存条 什么是指针
  • 指针本质就是一个操作首先的非负整数,值能进行相减 指针常见的错误
int main()
{
    int *p;  //p是变量的名字,int*表示P变量是存放int类型变量的地址
    int *i;
     *p=i;
   printf("%d\n",*p);
    return 0;
}
  • 如果要改变是惨的值,形参必须是指针
void huhuan(int a,int b)
{
    int t=0;
    t=a;
    a=b;
    b=t;
     return;
}
int main()
{
    int a=3;
    int b=5;
    huhuan(a,b);
    printf("%d,%d\n",a,b);
    return 0;
}
  • //局部变量在用完值后将会释放内存,并不会影响主函数
void huhuan(int *p,int *q)
{
    int t=0;
    t=*p;
    *p=*q;
    *q=t;

     return;
}
int main()
{
    int a=3;
    int b=5;
    huhuan(&a,&b);
    printf("%d,%d\n",a,b);
    return 0;
}

星号的三种含义

  • 星号的含义:1.乘法2.定义指针变量3.指向内容

  • *P指以P的内容为地址的变量 通过被调函数为什么可以修改主调函数

  • 执行完return函数就会停止

  • 实参必须是普通变量的地址,形参是指针变量 一维数组与指针变量

  • 一维数组是一个指针常量,它存放一维数组第一个元素的地址

  • 如果P是一个指针变量,则P[i]与*(p+i)等价

void f(int* p,int len)
{
    int i;
    for(i=0;i<len;++i)
        printf("%d  ",*(p+i));
        printf("\n");
}
int main()
{
    int a[5]={1,2,3,4,5};
    int b[6]={-1,-2,-3,-4,-5,-6,};
    int c[100]={1,99,22,23};
    f(a,5);
    f(b,6);
    f(c,100);
    return 0;
}
void huhuan(int *p,int len)
{
    p[3]=88;

     return;
}
int main()
{
   int a[5]={1,2,8,3,4};

    printf("%d\n",a[3]);
    huhuan(a,5);
    printf("%d\n",a[3]);
    return 0;
}

指针变量的运算 如果指针指向的是同一块连续空间的不同存储单元,则两个值才可以相减

void f(int* p,int len)
{
    int i;
    for(i=0;i<len;++i)
        printf("%d  ",*(p+i));
        printf("\n");
}
int main()
{
    char ch ='A';
    int i=99;
    double x=66.6 ;
    char *p=&ch;
    int *q=&i;
    double*r=&x;
    printf("%d %d %d",sizeof(p),sizeof(q),sizeof(r));
      return 0;
}
  • 指针变量保存第一个字节的地址,然后根据类型去访问改类型变量
  • 一个指针变量,无论它指向什么变量,改指针只占8个字节 动态内存分配问题 传统数组的缺点
  • 数组长度必须提前指定,且只能是长整数,不能是变量
  • 数组一旦定义,系统为数组分配的内存空间就会一直存在,除非数组所在函数运行完毕
  • 数组的长度一旦定义,骑在运行过程不会改变
  • 动态数组很好的解决了传统数组的缺陷
  • 要使用malloc就需要先定义
  • malloc只有一个形参,并且是整型
  • malloc函数只能返回第一个字节的地址
#include<malloc.h>
int main()
{
    int i=5;
    int*p=(int*)malloc(8);
      return 0;
}
  • p本身是静态释放的,所指向的变量是动态的
  • free(p)表示把p所值想内存释放掉
#include<malloc.h>
void f(int *q)
{
    *q=200;
}
int main()
{

    int*p=(int*)malloc(sizeof(int));
    *p=10;
    printf("%d\n",*p);
    f(p);
    printf("%d\n",*p);
      return 0;
}
#include<malloc.h>
int main()
{   int len,i;
    int*parr;
    printf("请输入你要存放的元素的个数");
    scanf("%d",&len);
    parr=(int*)malloc(4*len);
    for(i=0;i<len;++i)
        scanf("%d",&parr[i]);
    printf("一维数组的内容是:");
     for(i=0;i<len;++i)
        printf("%d\n",parr[i]);
     return 0;
}
    • 静态内存是有系统自动分配的,系统自动释放
  • 静态内存是有栈分配的
#include<malloc.h>
int main()
{   int i=0;
    int *p=&i;
    int**q=&p;
    int***r=&q;
    
     return 0;
}

[动态内存可以跨函数使用](www.bilibili.com/video/BV1os…? p=151) 跨函数使用内存

书本笔记

  1. 用户输入的字符被收集并存储在一个缓冲区
  2. 缓冲区的大小取决于系统
  3. 文件是存储器中存储信息的区域
  4. C是一门强大,灵活的语言,有许多用于打开,读取,写入和关闭文件的库函数
  5. 流是一个实际输入或输出映射的理想化数据流
  6. 计算机操作系统要以某种方式文件的开始和结束
  7. EOF是一个值,标志着检测到文件的结尾,并不是在文件中找的到符号
  8. 函数是完成特定任务的独立程序代码单元
  9. 类型声明是函数声明的一部分
  10. 数组使用前必须初始化
  11. 在使用数组时,要防止数组下标超出越界,必须保证是一个有效值
  12. 指针的值是他所指向对象的地址
  13. 在指针前使用*运算符可以得到该大小

课本习题

第一题
#include<malloc.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;
}

34.png

第二题
  • 四个元素
第三题

ref的地址是8的地址,第二个元素的地址,地址递加

第四题

12,16 12,14

第五题

12,16,12,14