写在最前面——这里用的是32位编译器,可能和你们的有点不同。然后就是欢迎大家指正和补充呀。
此文分为以下几个模块:
1. 指针的基础知识
2. 指针数组
3.数组指针
4. 函数和指针
一. 指针基本内容
- 初识指针
- 数组和指针的联系
- 指针的 “++”等 操作
- const 在指针中的应用
- 指针的动态分布
1. 初识指针
在之前的学习中我们已经知道,定义一个变量首先就要对它进行内存的分配。例如:int a; 这条语句中我们首先对 a 这个变量进行了空间的分配。为了直观地感受一下,我们通过取地址操作看看它所在位置。
#include<stdio.h>
int main()
{
int a;
printf("%p\n",&a); // 结果为 0060FEFC
return 0;
}
而指针是指向了一个固定地址,指针的内容就是一个地址值。我们定义一个整型指针将他指向整型变量,看看整型变量的地址和他的指针所存放的值。
#include<stdio.h>
int main()
{
int a;
int *p = &a;
printf("%p\n",&a);
printf("%08X\n",p); // 08表示一共输出8个字节数,多余位用0补齐,X是输出16进制的占位符
return 0;
}
答案是:
观察得,指针存放的值就是所指的变量的地址。
所以 p = &a; *p = a; (&为取地址符号,*为找到地址指向的变量)
2. 数组和指针的联系
我们在定义数组的时候有几种方法,他们的共同点是都知道此数组分配了多少的内存空间。这些内存空间是一次性分配的故他们在内存中的地址是紧挨着的。
当一个指针指向了数组时,他其实指向的是这个数组的头指针,例如:
#include<stdio.h>
int main()
{
int array[10] = {
2,3,49,23,1,9,43};
int *p = array;
printf("array[0]的地址: %p\n",array);
printf("p的数值: %08X\n",p);
printf("array 所占字节: %d\n",sizeof(array));
printf("指针p所占字节: %d\n",sizeof(p));
return 0;
}
结果为:
结果显示,指针指向的不仅仅是头指针,他也只指向头指针。也就是说指针指向的东西和后面的变量无关,但是他通过操作访问后面的变量。就是我们下面要说的对指针的操作。
3. 指针的 “++” 等操作
#include<stdio.h>
int main()
{
int array[10] = {
2,3,49,23,1,9,43};
int *p = array;
// 查看数组地址和指针
printf("array[0]的地址: %p\n",array);
printf("p的数值: %08X\n",p);
// 对指针进行移动操作
p ++