作者目前就读于,双非本科,大一,很多地方理解不当还望各位大佬耐心教导。万分感谢!
本文为C语言的小事系列,喜欢的同志可以订阅本专栏点→这里这里,都是在下学习时总结的精华,希望对您有所帮助。
开门见山的说:
也就是说指针是内存的门牌号啦
目录
一,指针的类型
如同数据变量——char int double等等类型一样
指针变量也有自己的类型。
如果是char的指针就是char*,int为int*,double为double*。
char* 类型的指针是为了存放 char 类型变量的地址。int* 类型的指针是为了存放 int 类型变量的地址。double* 类型的指针是为了存放double 类型变量的地址。
1,指针的类型决定了指针向前或者向后走一步有多大(距离)。
#include <stdio.h>
int main()
{
int n = 8;
char* c = (char*)&n;
//这里用强制转化(char*)将int类型指针转为char
int* i = &n;
printf("%p\n", &n);//n变量的地址
printf("%p\n", c);//char类型指针
printf("%p\n", c + 1);//char类型指针+1
printf("%p\n", i);//int型指针
printf("%p\n", i + 1);//int型+1
return 0;
}
n变量的地址=int型指针=char类型指针
咱们发现这三个指针变量是相等的 ,因为他们的地址都是变量n的地址
char类型指针 + 1,可以观测的末尾数字加了1
代表char*+1为跳过一个char*的指针空间,然而总所周知char类型为1个字节
则说明char*和char是相同的字节数量
int类型指针 + 1,int类型字节数量是4,自然末尾数由40变为了44。
2,指针的解引用
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
二,关于野指针
设想一个不准确的地址,会让你使用这个地址的时候访问到其他数据,然而这些数据如果是重要或者是系统的数据,就会造成很大的损失
野指针成因 (常见)
1. 指针未初始化
这就是常见的定义的指针却并不初始化。
2. 指针越界访问
int arr[5];
arr[5]=6;
经典定义5个数,访问数组时越界了
三,指针与数组名
数组名在本质上就为元素首元素地址
当我们在函数传参时,传数组类型时,函数的形参的定义变是指针形。
#include<stdio.h>
void th(int* brr)
{
printf("%d\n", sizeof(brr));
}
int main()
{
int arr[10] = { 0 };
printf("%d\n", sizeof(arr));// sizeof结果为40
th(arr);//传数组名sizeof结果为4
th(&arr[0]);//传数组首元素sizeof结果为4
return 0;
}
sizeof结果为40
函数调用,传数组名sizeof结果为4
函数调用,传数组首元素sizeof结果为4
四,补充:指针—指针
前提是两个指针必须 指向同一片空间
指针减去指针,结果是两个指针中元素个数的(需要取结果的绝对值)。
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
printf("%d\n", &arr[0]-&arr[9]);// 结果为-9,|9|为两个指针中元素个数
return 0;
}
结果为-9,|9|为两个指针中元素个数
哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞吧
Thanks♪(・ω・)ノ
(期待一下,要是有分享和收藏更好啦)