复习 数组
定义格式 类型 数组名[数组大小]
数组名+下标

int arr[2][3]={{1,2,3},{4,5,6}};
int arr[][3]={1,2,3,4,5,6};//二维数组定义的时候赋值 不能省略列 但可以省略行

 

内存地址 内存(字节) 每个字节编号(地址)
指针--->存放地址的类型 & 取地址 *取值(解引用)

指针定义
类型 *指针的名字 定义指针的格式 (类型 指针保存变量类型的地址)
(point 指针)
指针 可以通过地址修改/访问其他变量值
一般用在 内存申请+函数传参
指针 一般涉及到指针变量一个指向的方向

指针的类型
指针指向的数据的类型
指针--->内存 一条大街 每个字节--->门牌号(地址)
指针就是存放地址的变量

int *p
int 表明p指向一个int类型的变量
int* 表明指针是int*类型

使用过程中 p 表示指针变量 地址
*p 表示指针指向的内容 int
地址不一样 操作不一样
指针存的是什么东西 (地址)
指针如何赋值 如何使用(p *p)
p表示地址 *p是值

指针赋值 赋值变量的地址 &x 得到当前变量的地址
(每次运行的时候 变量地址未必一致)
NULL (特殊规定 指针没有指向任何变量 赋值)
指针 先复制 然后使用
变量没有赋值不能使用 指针没有赋值页不能使用
int x;
printf("%d",x);乱码
规定 如果指针没有指向内容 让指针赋值为NULL (相当于指针的默认值 需要手动赋值)
指针赋值后使用 *p
操作 *p操作指向变量的值

*解引用 只能用于指针
一级指针 int *p/double *p/float *p/char *p

内存的分配 一次程序运行的时候变量分配的地址是不变的
指针很麻烦 并且不实用

指针 1.能不能存值--->
int x;
int *p;
p=1;//操作是错误的 赋值时地址
int*p=x;//x int类型 赋值指针 错误的
p=&x;

指针 2.麻烦
指针去修改变量的值
变量可以通过变量名去修改
有一种情况 不能通过变量名去修改 必须用到指针 函数传参

指针 3.必须使用指针
内存四区 --->定义一个变量 (在内存中分配一块地址)
栈区 (定义变量 定义在栈区) 内存不需要管理 自动分配内存 自动释放 (缺点 栈溢出 大概只有4M空间 再大就管理不了) 例如arr[1000000000000];
堆区 (手动申请 手动释放 必须用指针操作) 手动确定数组大小(动态数组) 堆区
全局静态常量区 存放全局变量 静态变量 常量 (比栈区大)
代码区 (存放代码二进制)
函数里面定义的变量 在栈区
堆区 用函数申请释放
全局变量 放在main函数外面 在函数外部定义的变量
静态 static 修饰的变量
字符串常量---->存放在常量区 常量 数据不能修改

 

 

 

 

 1 #include<stdio.h>
 2 #include<stdlib.h>//srand rand sysytem malloc free
 3 int main()
 4 {
 5 #if 0
 6     
 7     int x = 0;//定义变量 赋值
 8     //取到x的地址
 9     int *p;//定义  定义变量
10     p= &x;//赋值   给指针赋值
11     printf("%pn",p);//打印p的值(地址)
12     *p = 20;//修改的x 操作*p和操作x 用指针去修改另外一个变量的值
13     if (p == NULL)
14     {
15         //说明指针没有指向任何内容 不能使用 *p 
16     }
17     printf("%pn",p);//打印p的值(地址)
18     printf("%pn",&x);//打印地址 格式占位符%p
19     //假设需要申请一块空间 存放int   malloc(sizeof(int)*1);//申请内存 返回一个地址 必须用指针保存 ()里面是申请的内存的大小 一般搭配sizeof 返回一个地址 括号里面的数字 表明大小 单位是字节
20     //malloc 内存申请 分配多少空间
21 
22     //使用时和数组一样
23     int*q = (int*)malloc(sizeof(int)* 100);
24     *q=2;//操作第一个int *(q+n) 操作第n+1个int *(q+0)~*(q+99)
25     q[0] = 2;//q[n]相当于 *(q+n) 
26     for (int i = 0; i < 100; ++i)
27     {
28         *(q + i) = i;//通过指针 使用堆内存
29         //或者 q[i]=i;
30         printf("%d",*(q+i));
31     }
32     //q[100];//越界
33     //*(q+100);//越界
34     int*myPoint = (int*)malloc(sizeof(int)*x);//内存申请 数组在堆区 大小 是由变量来决定的 动态数组
35     //int arr[100];//数组大小必须是常量  静态数组
36 
37     free(q);//堆区内存必须要手动释放
38     free(myPoint);
39     while (1)
40     {
41         malloc(sizeof(int)*1000);
42     }
43 #endif
44 
45 #if 1
46     char mystr[] = "hello world";//mystr 数组 栈区
47     char *pstr = "hello world";//pstr定义的是指针 保存的是地址 保存的是字符串的地址
48     //char*pstr="hello world";//常量区 内容不能修改
49     //pstr = "hello world";//字符串的地址赋值给了pstr
50     mystr[0] = '1';
51     //pstr[0] = '1';//用指针修改了常量区的内容 所以会报错
52     //*(pstr+0)='1';
53 
54 #endif
55 
56     getchar();
57     return 0;
58 }

 

 

 

1.指针 定义格式 int*p int表示p要指向的内容(p保存的变量的地址) *表示这是指针 p表示指针的名字
使用方式 赋值 用地址给指针赋值(需要一个额外的变量)
使用 *p 代表p指向的内容

2.内存四区
栈区
堆区
全局静态常量区(全局区)
代码区

3.特殊指针用法
堆区的内存申请释放 malloc free 头文件 stdlib.h
char*p="hello"和char arr[]="hello"的区别

注意事项 1.指针使用的时候必须向赋值然后使用
2.指针只能赋值地址
3.内存申请必须释放 不释放会占内存 直到重启
4.定义指针int*p
p相当于地址 *p相当于指向的内容
5.不同类型指针不能互相赋值 (类型不一样 操作也不一样)
//除了malloc 不考虑任何强转

 

 

 

2018-07-20   10:29:29

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程

4483 9.9元 19.8元 5折
3734 0元 50元 限免