变量
存储空间的别名,访问这块空间 比指针更安全
使用指针也可以访问存储空间 在变量名无法使用的场合
局部参数传递 动态分配内存
指针也是一个变量 有自己的存储空间
指针也会有指针 -> 指针的本质:保存内存地址的变量 使用指针都是间接访问: 指针访问的内存地址,通过内存地址间接访问空间
使用指针赋值和变量赋值的区别
{ int n = 10; //直接访问 int *pn = &n; //间接访问 n = 100; *pn = 1000; return 0; }
转到反汇编012616A5 mov dword ptr [ebp-4],eax int n = 10; //直接访问 012616A8 mov dword ptr [n],0Ah int *pn = &n; //间接访问 012616AF lea eax,[n] 012616B2 mov dword ptr [pn],eax n = 100; 012616B5 mov dword ptr [n],64h //一步到位,直接赋值 *pn = 1000; 012616BC mov eax,dword ptr [pn] // 先取值到eax,寻址 012616BF mov dword ptr [eax],3E8h //再进行赋值 return 0; 012616C5 xor eax,eax
使用变量的效率比使用指针的效率高
使用指针的场合
在函数中改变变量的值
void foo(int *n) { *n = 100; }
指针和const结合
int main() { //const 在*左边 指针指向的数据 为常量 //const 在*右边 指针本身 为常量 const int *p; int const *p1; int *const p2; const int *const p3; const int const *const p4; int n = 10; int n2 = 100; p = &n2; //指针本身能改 // *p = 100; //指向的数据不能改 // p2 = &n2; //指针本身不能改 *p2 = 1000; //指向的数据能改 return 0; }
指针和数组
//数组:相同变量名的一种集合 属于直接访问 int main() { int array[10] = { 1,2,3,4,5 };//编译器分配一段内存空间 int *parray = array; //array-> 数组的首地址 array[0](同时也是数组的地址) //大部分情况下 数组名=常量指针 //使用指针访问数组 printf("%d\r\n", *parray); printf("%d\r\n", *parray + 1); printf("%d\r\n", *parray + 2); printf("%d\r\n", *parray + 3); // 以下两种场合 // sizeof 运算 指针得到的是指针的大小 数组得到的是数组的大小 // 做&运算 int *paddrarray = &array; //加&代表取当前数组地址 printf("%d\r\n", parray+1,paddrarray+1); printf("%d\r\n", array + 1, &array + 1);//运算的规则不同 // array+sizeof(*array) // *array+sizeof(*&array) return 0; }