指针
我们通常把指针变量叫做指针,准确的说,这样的理解是错误的。首先我想在这里明确一下指针与指针变量是两个概念。
-
指针:
一个变量的地址指出了变量的存储单元在内存中的具体位置,能对变量进行存取操作。这个变量的地址就是变量的指针。 -
指针变量:
指针是一种具有特殊意义的整型数,指针不能存放在一般的整型变量中,必须存放在专门指针的变量中,这类变量就是指针变量。
int i = 10;
int *p = &i;
return 0;
在这段代码中 i 是一个整形变量, p 是一个指针变量,存放着 i 的地址,&i 是一个指针。
指针变量
-
指针的定义
C 语言规定所有变量在使用前必须先定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是专门用来存放地址的,所以必须将它定义为“指针类型”。 -
指针变量定义的一般形式为:
基类型 *指针变量名; -
例如:
int* p
char* p
double *p
...
- 指针的大小
一个指针变量在内存中占4字节或8字节(32位平台或64位平台)。 - 操作符 ‘ * ’
int i=10;
int *p=&i;
在上面这段代码中,指针变量p中存的是整形变量i的地址,我们可以通过 *p来读取到i的内容。
- 有这样一个问题我觉得有必要在这里讲清楚
以整形为例,我们知道一个int型的数据在内存中占四个字节,指针变量p存的是整形变量i的哪一个字节的地址呢?
在内存窗口和监视窗口中取出i的地址和p的内容我们可以看出,答案是最低字节的地址
- 指针+ - 整数
int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return 0;
}
通过这段代码我们可以看出,指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用 就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
- 指针-指针
int main()
{
int arr[5] = { 0 };
int *ps = &arr[0];
int *pe = &arr[4];
printf("%d\n", pe - ps);
system("pause");
return 0;
}
我们把数组类型换成char试试:
结果还是4,由此我们可以得出一个结论:
指针-指针所得出的结果是两指针之间元素的个数
这里要注意指针-指针的前提条件是指向同一块内存空间
- 二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 这就是 二级指针
int i=10;
int *p=&i;
int **pa=&p;
在这段代码中,pa就是一个二级指针,其内容为p的地址,对pa进行解引用操作可以找到p中的内容,即i的地址,在对齐进行解引用操作可以拿出i的值,也就是说,*p和**pa以及i的值是相同的
- 指针与数组
既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能