指针
内存四区
- 代码区–存放代码
- 全局区–全局的常量【字符串常量“abc”, 变量】
- 栈区-- 系统自动开辟,系统自动释放。并不是很大
- 堆区-- 动态开辟的内存,手动开辟,手动释放,很大
#include <stdio.h>
int main()
{
// i的作用域在for循环中,在for中定义i, 未释放,系统自动处理, i存放于栈中
for (int i = 0; i<10; i++)
{
printtf("%d\n", i);
}
// malloc free new delete 没有使用这些,基本上都在栈中
return 0;
}
地址
把内存以单个字节为单位,分开。每一个字节编号,这个编号就是地址
- 编号是连续的
- 唯一的,不可变
- 取地址运算符:&,单目运算符 优先级只比 ()[].低
首地址
一段内存空间中第一个存储单元
指针变量:
- 用来存放地址的变量
- 内存大小都是4B
地址是一些编号,一种数据。
整数:int a
字符:char c
小数:float
地址:指针变量
- 指针变量的定义:
// 数据类型 *变量名 int *p; // 定义一个指针变量p,存的是地址 // int 指明指针指向的数据类型 // * 指明p这个变量是一个指针变量
- 指针变量的赋值:
int a = 1; int *p; p = &a;
- 指针变量的引用:
*p
野指针
不能明确指向的指针变量,危险
空指针
void *p
指针运算
+
-
++
--
指针偏移,去访问地址旁边的一些内存
指针变量的加减,已指针所指向的类型空间为单位进行偏移
char *p; // char 1 p+1 1B
int *p1; // int 4 p1+1 4B
double *p2; // double p2+1 8B
一维数组与指针
- 定义一个一维数据,数组名是这个数组的**《首地址》**。
- 访问数据元素
下标法: a[0]、a[1]
指针法:int a[5] = {1,2,3,4,5}; int *p = a; for (int i=0; i < 5; i++) { printf("%d", *(p+i)); // 不会改变p的地址 // printf("%d", *p++) 会改变p的地址 }