C语言-指针深度分析
1、变量回顾
程序中的变量只是—段存储空间的别名,那么是不
是必须通过这个别名才能使用这段存储空间?
2、思考
下面的程序输出什么?为什么?
1 int i = 5; 2 int* p = &i; 3 4 printf("%d, %p\n", i, p); 5 6 *p = 10; 7 8 printf("%d, %p\n", i, p);
3、*号的意义
在指针声明时,*号表示所声明的变量为指针
在指针使用时,*号表示取指针所指向的内存空间中的值
*相当于一把钥匙,通过这把钥匙打开内存,读取内存中的值。
4、实例分析
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = 0; 6 int* pI; 7 char* pC; 8 float* pF; 9 10 pI = &i; 11 12 *pI = 10; 13 14 printf("%p, %p, %d\n", pI, &i, i); 15 printf("%d, %d, %p\n", sizeof(int*), sizeof(pI), &pI); 16 printf("%d, %d, %p\n", sizeof(char*), sizeof(pC), &pC); 17 printf("%d, %d, %p\n", sizeof(float*), sizeof(pF), &pF); 18 19 return 0; 20 }
5、传值调用与传址调用
指针是变量,因此可以声明指针参数
当—个函数体内部需要改变实参的值,则需要使用指针参数 (★)
函数调用时实参值将复制到形参
指针适用于复杂数据类型作为参数的函数中
6、编程实验
利用指针交换变量 26-2.c
1 #include <stdio.h> 2 3 int swap(int* a, int* b) 4 { 5 int c = *a; 6 7 *a = *b; 8 9 *b = c; 10 } 11 12 int main() 13 { 14 int aa = 1; 15 int bb = 2; 16 17 printf("aa = %d, bb = %d\n", aa, bb); 18 19 swap(&aa, &bb); 20 21 printf("aa = %d, bb = %d\n", aa, bb); 22 23 return 0; 24 }
7、常量与指针
常量指针( p可变,p指向的内容不可变 )
- const int* p;
- int const* p;
指针常量 (p不可变,p指向的内容可变 )
- int* const p;
*p与p均为常量
- const int* const p; //p和p指向的内容都不可变
8、实例分析
常量与指针 26-3.c
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = 0; 6 7 const int* p1 = &i; 8 int const* p2 = &i; 9 int* const p3 = &i; 10 const int* const p4 = &i; 11 12 *p1 = 1; // compile error 13 p1 = NULL; // ok 14 15 *p2 = 2; // compile error 16 p2 = NULL; // ok 17 18 *p3 = 3; // ok 19 p3 = NULL; // compile error 20 21 *p4 = 4; // compile error 22 p4 = NULL; // compile error 23 24 return 0; 25 }
9、小结
指针是C语言中一种特别的变量
指针所保存的值是内存的地址
可以通过指针修改内存中的任意地址内容