笔记
视频笔记
指针
- 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) 跨函数使用内存
书本笔记
- 用户输入的字符被收集并存储在一个缓冲区
- 缓冲区的大小取决于系统
- 文件是存储器中存储信息的区域
- C是一门强大,灵活的语言,有许多用于打开,读取,写入和关闭文件的库函数
- 流是一个实际输入或输出映射的理想化数据流
- 计算机操作系统要以某种方式文件的开始和结束
- EOF是一个值,标志着检测到文件的结尾,并不是在文件中找的到符号
- 函数是完成特定任务的独立程序代码单元
- 类型声明是函数声明的一部分
- 数组使用前必须初始化
- 在使用数组时,要防止数组下标超出越界,必须保证是一个有效值
- 指针的值是他所指向对象的地址
- 在指针前使用*运算符可以得到该大小
课本习题
第一题
#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;
}
第二题
- 四个元素
第三题
ref的地址是8的地址,第二个元素的地址,地址递加
第四题
12,16 12,14
第五题
12,16,12,14