#include int main()
{int a = 10; //在内存中开辟一块4个字节的空间int* pa = &a; //这里我们对变量a,取出它的地址,可以用&(取地址操作符)//整形变量a占用4个字节的内存空间,第7行代码是将a的4个字节的第一个字节的地址存放在变量pa中,pa就是一个指针变量printf("%p", pa); //%p为指针变量的格式化输出return 0;
}
运行结果
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
…
11111111 11111111 11111111 11111111
这里就有2的32次方个地址。
每个地址标识一个字节,那我们就可以给 (2^32Byte == 2^32/1024KB ==
2^32/1024/1024MB ==2^32/1024/1024/1024GB == 4GB) 4G的空间进行编址。
同样的方法,那64位机器,如果给64根地址线,那能编址多大空间,计算亦如此。
这里我们便明白:
int num = 10;
p = #
要将&num(num的地址)保存到p中,我们知道p就是一个指针变量,那它的类型是怎样的呢?
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
这里可以看到,指针的定义方式是: type + * 。
其实:
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
#define _CRT_SECURE_NO_WARNINGS 1
#include 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);//输出比pc大1个字节printf("%p\n", pi);printf("%p\n", pi + 1);//输出比pi大4个字节return 0;
}
运行结果
#include int main()
{int n = 0x11223344;char* pc = (char*)&n;int* pi = &n;*pc = 0;printf("%x\n", n);*pi = 0;printf("%x\n", n);return 0;
}
运行结果
1、指针未初始化
#include
int main()
{
int *p;//局部变量指针未初始化,默认为随机值*p = 20;
return 0;
}
2、指针访问越界
#include
int main()
{int arr[10] = {0};int *p = arr;int i = 0;for(i=0; i<=11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}
3、指针指向的空间释放
#include
int main()
{int *p = NULL;//....int a = 10;p = &a;if(p != NULL){*p = 20;}return 0;
}
#include int my_strlen(char* s)
{char* p = s;while (*p != '\0')p++;return p - s;
}int main()
{char arr[] = "abc";int a = my_strlen(arr);printf("%d\n", a);return 0;
}
运行结果
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{*vp = 0;
}
#include int main()
{int arr[3] = { 1,2,3 };printf("%p\n", arr);printf("%p\n", &arr[0]);return 0;
}
运行结果
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr;//p存放的是数组首元素的地址
#include int main()
{int arr[3] = { 1,2,3 };int* p = arr; //指针存放数组首元素的地址int sz = sizeof(arr) / sizeof(arr[0]);//计算数组大小for (int i = 0; i < sz; i++){printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p + i);}for (int j = 0; j < sz; j++){printf("%d ", *(p + j));}return 0;
}
运行结果
总结: p+i 其实计算的是数组 arr 下标为i的地址。那我们就可以直接通过指针来访问数组。
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
那就是 二级指针 。
对于二级指针的运算有:
int b = 20;
*ppa = &b;//等价于 pa = &b;
**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;
int arr1[5];
char arr2[6];
int* arr3[5];//是什么?
即arr3是一个数组,有五个元素,每个元素是一个整形指针。