概述
指针(一) 基础
一 指针的概念
- 为了方便访问内存中的内容,给每个内存单元一个编号,我们称这个编号为地址,及为指针.
- 指针也是一种数据类型 所以指针都有自己的内存 存储的是地址(编号)
指针的四要素
- 指针本身的类型 除去指针名,剩下的就是指针本身的类型
- 指针指向的类型 除去指针名和一个*,剩下的就是指针指向的类型
- 指针本身的内存 用来存储一个编号(4字节)
- 指针指向的内存 可以是各种类型
int num = 0; // 类型: int
int arr[10] = {}; // 类型: int [10]
int* MuShan = {1,2,3};
//去掉名字,剩下的就是类型
二 指针的定义
1 运算符
*: 定义时,表示定义的是一个指针 其他的时候表示解析引用
&: 取地址符(用于取地址)
2 定义
指针的定义有多种理解方式;
- 类型 变量名;
int* p; // 类型: int
// 变量名: *p
- 指针本身类型 指针名;
int* p; // 指针本身的类型: int*
// 指针名: p
- 指针指向的类型* 指针名;
int* p; // 指针指向的类型: int
// 指针名: p
反推:
- 除去指针名,剩下的就是指针本身的类型
- 除去指针名和一个*,剩下的就是指针指向的类型
int****** p1; // p1本身的类型: int******
// p1指向的类型: int***** (6级指针可以指向5级指针)
三 指针的内存
- 所有的指针,无论类型,在内存中都占4个字节的内存(存的是地址)(具体和64/32位环境相关)
#include <stdio.h>
int main()
{
char* pch;
short* psh;
int* pn;
float* pf;
double* pd;
printf("%dn", sizeof(pch)); // 4
printf("%dn", sizeof(psh)); // 4
printf("%dn", sizeof(pn)); // 4
printf("%dn", sizeof(pf)); // 4
printf("%dn", sizeof(pd)); // 4
return 0;
}
- 指向起始地址
int num = 10;
int* p = #
四 指针的初始化与赋值
1 用对应类型变量的地址
int num = 10;
int* pn = # //初始化
float f = 3.14f;
float* pf;
pf = &f; //赋值
2 用相同类型的指针
int num = 10;
int* pn = # // 初始值
int* p1 = pn; // 初始化
int* p2;
p2 = pn; // 赋值
3 直接用地址
int* p = (int*)0x36;
4 用数组名
一级指针可以接受一堆一位数组的数组名
int arr[5] = { 1,2,3,4,5 };
int* p = arr;
5 字符串
#include <stdio.h>
int main()
{
// 数组名就是数组的首地址
char arr[5] = { 'a','b','c' };
char* p = arr;
printf("%sn",p); //输出:abc
char str[5] = "abcd";
p = str;
printf("%sn", str); //输出:abcd
printf("%sn", p); //输出:abcd
// ==> char*类型的指针可以直接用来打印整个字符串到'