#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
指针就是变量,用来存放地址的变量(存放在指针中的值被当成地址来处理)
指针的大小在32位平台上是4个字节,在64位平台上是8个字节。
/*指针类型决定了
(1)指针进行解引用操作时,能够访问空间的大小
int* p:能够访问4个字节
char* p:只能够访问1个字节
double* p:能够访问8个字节
(2)指针走一步走多远(偏移几个字节)
int* p:p+1->偏移4个字节
char* p:p+1->只偏移了一个字节
*/
/*野指针:指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)
野指针出现的情况:1、指针未定义 2、指针越界访问 3、指针指向的空间释放*/
局部变量不初始化,默认是随机值
若在某些情况中不清楚让指针指向何处时,只需将指针指向空指针即可
eg:
int main()
{
int a = 10;
int* p = NULL;
p = &a;
*p = 20;
printf("%d", a);
return 0;
}
指针的运算
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int *p = arr;
for (i; i < 10; i++)
{
printf("%d ", *p);
p++;
}
return 0;
}
指针 — 指针
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d",&arr[9] - &arr[0]);//&arr[9] - &arr[0]——计算数组内的元素个数
//注意,相减的两个指针必须是同一个内存块里的,不然会出现错误
return 0;
}
用指针-指针的方法求字符串长度
int my_strlen(char* str)
{
char* start = str;
char* end = str;
while (*end != '\0')
{
end++;
}
return (end - start);
}
int main()
{
char arr[] = "bit";
int p = my_strlen(arr);
printf("%d", p);
}
指针的关系运算
int main()
{
int arr[5] = {};
int* vp = arr;
for (vp;vp<&arr[5];)
{
*vp++=1;//先给*vp赋值1,再给指针vp+1
}
int i = 0;
for (i=0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
二级指针
int main()
{
int a = 10;
int* pa = &a;//int*—— *表示pa为指针变量,int表示指针变量所指的类型为int,即变量a的类型为int
int** ppa = &pa;//ppa即为二级指针 int**——*表示ppa为指针变量,int*为指针所致的变量类型为int*
**ppa = 20;//*ppa访问的是pa中所存储的地址 **pa先通过*ppa找到pa,然后对pa进行解引用操作,即*pa,即a
printf("%d", a);//结果为:20
return 0;
}
指针数组——指针数组是一个存放指针的数组,指针指的是所指对象的地址
int main()
{
int a = 10;
int b = 20;
int c = 30;
int* arr[] = { &a,&b,&c };//int* arr[] 称为整形指针数组
printf("%d\n%d\n%u\n", *arr[0], *arr[1], *arr[2]);
return 0;
}