1. 指针的概念
指针就是变量,就是存放地址的变量
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 100;
//在内存中开辟的一块空间
int* p = &a;
//对变量a,取出它的地址,可以使用&操作符
//将a的地址存放在p变量中,p就是一个之指针变量。
system("pause");
return 0;
}
- 对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的是产生一个电信号正电/负电(1或者0),那么32根地址线产生的地址就会是:
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
…
11111111 11111111 11111111 11111111
每个地址标识一个字节,那我们就可以给 (2^32Byte == 2^32/1024KB == 2^32 /1024/1024MB==2^32/1024/1024/1024GB == 4GB) 4G的空闲进行编址。
- 对于64位的机器,假设有64根地址线,那么32根地址线产生的地址就会是:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001
,,,,,,,
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
每个地址标识一个字节,那我们就可以给 (2^64Byte == 2^64/1024KB == 2^64 /1024/1024MB==2^64/1024/1024/1024GB == 8GB) 8G的空闲进行编址。
在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针 变量的大小就应该是4个字节。 在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
综上总结:指针的大小在32位平台是4个字节,在64位平台是8个字节
2. 指针和指针类型
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。
3.指针运算
- 指针± 整数
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
*(arr + i) = 0;
}
- 指针—指针(得到的是指针与指针之间的元素个数,应该同类型相减)
int—int,char—char
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
printf("%d\n", (arr + 9) - arr);
//结果输出为9
4.二级指针
- 指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 所以就有了 二级指针 。
int a = 10;
int* pa = &a;
int** ppa = &pa;
//a的地址存放在pa中
//pa的地址存放在ppa中
//pa是一级指针,ppa是二级指针
5.指针与数组(名)
- 数组名表示的是数组首元素的地址
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
printf("%p\n", arr);
printf("%p\n", &arr[0]);
//arr=00F3FB30
// &arr[0]=00F3FB30
- 还可以用指针来访问数组中每一个元素的地址
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int* p = arr;
int size = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < size; i++)
{
printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p + i);
}
输出为:
//&arr[0] = 008FFABC <= == = > p + 0 = 008FFABC
//& arr[1] = 008FFAC0 <= == = > p + 1 = 008FFAC0
//& arr[2] = 008FFAC4 <= == = > p + 2 = 008FFAC4
//& arr[3] = 008FFAC8 <= == = > p + 3 = 008FFAC8
//& arr[4] = 008FFACC <= == = > p + 4 = 008FFACC
//& arr[5] = 008FFAD0 <= == = > p + 5 = 008FFAD0
//& arr[6] = 008FFAD4 <= == = > p + 6 = 008FFAD4
//& arr[7] = 008FFAD8 <= == = > p + 7 = 008FFAD8
//& arr[8] = 008FFADC <= == = > p + 8 = 008FFADC
//& arr[9] = 008FFAE0 <= == = > p + 9 = 008FFAE0
6.指针数组
-
指针数组是数组,是存放指针的数组。
举个例子:
int arr1[7];
char arr2[7];
int* arr3[5];