指针
启动一个程序,系统在内存上给程序分配一块内存空间32位4G一个一个字节组成的,每个字节都会有地址编号内存的空间是
地址:内存的编号
我们把这个编号(地址)t也叫做指针
指针变量
存放指针(地址)的变量
因为地址编号(Ox0000 0000)如此,所以我们的指针变量占4个字节就可以存下
64位编译器,内存的编号范围是Ox00000000000oo0 - oxf1f,这样的编号需要8个字节存下,所以指针变量也需要8个字节
#include <stdio.h>
#include <string.h>
int main()
{
int a = 10;
//定义指针三步骤
//1 *与符号结合是一个指针变量
//2 要保存谁的地址,将他的定义形式放在此处
//3 用*p替换掉定义的变量
int* p;
p = &a;
*p = 100;
printf("%d %d\n", *p, a);
return 0;
}
野指针 空指针
#include <stdio.h>
#include <string.h>
int main()
{
int a = 10;
int* p;
*p = 200; //野指针就是没有初始化的指针 指针方向是随机的,不可以操作野指针
printf("%d\n", *p);
int* p1 = NULL; //给指针p1的内容赋值为0
void* p2 = (void*)&a; //万能指针可以保存任意的地址
printf("%d\n", *(int*)p2);
int* const p4 = &a; // 可以修改值
*p4 = 200;
const int* p5 = &a; // 可以修改指针
p5 = NULL;
return 0;
}
数组与指针
#include <stdio.h>
#include <string.h>
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; // 数组地址在内存中是连续的
int* p = a;// 指针p保存数组的首元素地址
for (int i = 0; i < sizeof(a) / sizeof(int); i++)
{
printf("%d ", *(p + i));
}
return 0;
}
指针与字符数组
#include <stdio.h>
#include <string.h>
int main()
{
char a[] = "helloworld"; //定义一个字符数组,内容helloworld\0
char* p = a;
printf("%s", p); //只需要字符数组的首地址
return 0;
}