对应的视屏链接:鲍松山的个人空间_哔哩哔哩_bilibili
目录
1、指针地位
指针号称C的灵魂,一个字可以概括指针的地位:哥
2、指针的概念----两值四方面
两值:自身的值、指向的值
四方面:
1、指针的本质:地址
2、指针自身类型:int *ptr, int *
3、指针指向类型:int *ptr, int
4、指针的大小:所占内存空间数,4字节或8字节
3、什么是地址
地址就是内存单元的编号
4、指针操作
1、获取变量地址
#include<stdio.h>
int main()
{
int a = 10;
printf("a的值为:%d, a的地址为:0x%p\n", a, &a);
return 0;
}
对变量取地址,通过&符号
2、指针的本质
//定义变量,本质是要开辟内存空间,只要开辟空间,就会有地址,那地址如何存储,就是使用指针变量
#include<stdio.h>
int main()
{
int a = 10;
int *p = &a; //p是指针变量,保存了a的地址
return 0;
}
指针变量是保存指针的变量,而给p却赋值一个地址,从而推出,指针其实就是地址而已。
3、指针的大小
#include<stdio.h>
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));
return 0;
}
可以分别测试32位和64位的运行结果:4字节、8字节
4、指针的两值
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int *p = NULL;
p = &a;
*p = 100; //修改指向的值
p = &b; //修改自身的值
return 0;
}
p指针变量保存了a的地址,我们就形象认为p指向了a
此时对于p来说,有两方面的值,一是p变量自身的值,二是*p所指向的值(也称解引用)
对*p赋值,就是修改指向的值,即修改a的值
对p赋值,比如p=&b,就是修改p指针变量自身空间的值,即让p不再指向a,而是指向b
5、指针两值的验证
在上文中,说到指针有两值,如何证明?
-
const int *p
int main()
{
int a = 10;
int b = 20;
const int *p = &a;
//*p = 100; //不可以修改指向的值
p = &b; //可以修改自身的值
return 0;
}
-
int *const p
int main()
{
int a = 10;
int b = 20;
int *const p = &a;
*p = 100; //可以修改指向的值
//p = &b; //不可以修改自身的值
return 0;
}
-
const int * const p
int main()
{
int a = 10;
int b = 20;
const int *const p = &a;
//*p = 100; //不可以修改指向的值
//p = &b; //不可以修改自身的值
return 0;
}
const是修饰*p(指向的值)为常量,还是p(自身的值)为常量,关键在于const是在*的左边还是右边
6、指针的两类型
-
自身的类型
char *pc; //把名字pc去掉,剩下的char*就是pc指针变量自身的类型,即字符指针类型
short *ps; //把名字ps去掉,剩下的short*就是ps指针变量自身的类型,即短整型指针类型
int *pi; //把名字pi去掉,剩下的int*就是pi指针变量自身的类型,即整形指针类型
double *pd; //把名字pd去掉,剩下的double*就是pd指针变量自身的类型,即浮点指针类型
//总结:当能够定义出指针变量的时候,只需把名字去掉,剩下的就是指针变量自身的类型
-
指向的类型
char *pc; //把名字pc和*去掉,剩下的char就是pc指针变量指向的类型,即字符类型
short *ps; //把名字ps和*去掉,剩下的short就是ps指针变量指向的类型,即短整型类型
int *pi; //把名字pi和*去掉,剩下的int就是pi指针变量指向的类型,即整形类型
double *pd; //把名字pd和*去掉,剩下的double就是pd指针变量指向的类型,即浮点类型
//总结:当能够定义出指针变量的时候,把名字和*去掉,剩下的就是指针变量指向的类型
5、指针应用
-
操作数组
#include <stdio.h>
int main()
{
int ar[] = {1,2,3,4,5,6,7,8,9,10};
int n = sizeof(ar) / sizeof(ar[0]);
//数组名访问
for(int i=0; i<n; ++i)
printf("%d ", ar[i]);
printf("\n");
//指针访问
int *ptr = ar;
for(int i=0; i<n; ++i)
printf("%d ", *(ptr+i));
printf("\n");
return 0;
}
-
交换两数
#include <stdio.h>
int Swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("a = %d, b = %d\n", a, b);
Swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
-
函数的出参
#include <stdio.h>
//v参数就是出参,目的是为了把结果携带出来
void Sum(int a, int b, int *v)
{
*v = a + b;
}
int main()
{
int a = 10, b = 20;
int result = 0;
Sum(a, b, &result);
printf("%d + %d = %d\n", a, b, result);
return 0;
}