1.指针是什么
通俗一点来说,指针就是用来保存内存地址的
2.格式
- 指针类型说明 *指针变量名
🌰:
char *p; // 一个用于指向字符形变量的指针
int *q; // 一个用于指向整形变量的指针
long *t; // 一个用于指向长整形变量的指针
float *r; // 一个用于指向单精度浮点形变量的指针
double *s; // 一个用于指向双精度浮点形变量的指针
3.初始化
- 1.定义的同时初始化
int a = 5;
int *p = &a;
- 2.先定义后初始化
int a = 5;
int *p;
p=&a;
4.指针注意点
- 在定义指针时,“*”号表示定义的变量是指针变量,变量的值只能存放地址。
- 一个类型的指针只能指向同类型的变量,不能指向其他类型的变量。
//这里指针的类型与指向地址内容的数据类型要一致,都为int
int a = 50;
int *p = &a;
- 多个指针变量可以指向同一个地址
int a =50;
int *p1 = &a;
int *p2 = &a;
- 指针的指向是可以改变的
int a =50;
int b = 10;
int *p = &a;
*p = 88;
p = &b;
*p = 50;
printf("a:%i--b:%i\n",a,b);
//输出:
a:88--b:50
- 在定义变量的时候 * 是一个类型说明符,说明定义的这个变量是一个指针变量
int *p=NULL; // 定义指针变量
- 在不是定义变量的时候 *是一个操作符,访问指针所指向存储空间
int a = 5;
int *p = &a;
printf("a = %d", *p); // 访问指针变量
5.指针为什么要分类型
- 虽然所有的指针都只占8个字节,但不同类型的变量却占不同的字节数。
- 一个int占用4个字节,一个char占用1个字节,而一个double占用8字节;
- 现在只有一个地址,我怎么才能知道要从这个地址开始向后访问多少个字节的存储空间呢,是4个,是1个,还是8个。
- 所以指针变量需要它所指向的数据类型告诉它要访问多少个字节存储空间,也就是说指针根据指针类型取对应的字节数的内存空间,这里可以结合前面(https://www.jianshu.com/p/7dbf84fbd16d)用char类型的指针取int变量中每个字节存储的数值来看
6.指针与数组
int nums[] = {1,3,5,7,9};
// nums = &nums = &nums[0] 都是数组的内存地址
int *p = nums;
- 利用指向数组的指针操作数组
int nums[] = {1,3,5,7,9};
// nums = &nums = &nums[0] 都是数组的内存地址
int *p = nums;
printf("----%i\n--------%i\n------%i\n",*p,*(p+1),p[2]);
//输出:
----1
--------3
------5
如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同 一数组中的上一个元素。
- 引用一个数组元素,可用下面两种方法:
- 下标法:如nums[i]形式,因为 p = nums,所以也可以用p[i]的形式
- 指针法: *(p+i)形式
网友评论