C语言基础知识 -- 指针

1.指针是什么

在计算机科学中,指针(pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”,意思是通过它能找到以它为地址的内存单元。

指针是一个变量,内存存放单元的地址(编号)

一个单元为1个字节

总结:

  • 指针是用来存放地址的,地址是唯一标示一块地址空间的
  • 指针的大小在32位平台是4个字节,在64位平台是8个字节
  • 1个字节8位
#include <stdio.h>

int main()
{
	int a = 10;
	int *p  = &a;
    return 0;
}

2.指针和指针类型

#include <stdio.h>

int main()
{
	printf("%d\n",sizeof(char*));
	printf("%d\n",sizeof(short*));
	printf("%d\n",sizeof(int*));
	printf("%d\n",sizeof(double*));
    return 0;
}

// 指针类型,在64位平台,输出结果均为8

指针类型 决定了指针进行解引用操作的时候,能够访问空间的大小

指针类型决定了:指针向前或向后走一步有多大距离

int *p;    //*p能够访问4个字节
char *p;    //*p能够访问1个字节
double *p;    //*p能够访问8个字节

int *p+1;    //*p跳过4个字节
char *p+1;    //*p跳过1个字节
double *p+1;    //*p跳过8个字节

 通过指针把数组中每个元素都变成1(重要,值得参考)

#include <stdio.h>

int main()
{
	int arr[10] = {0};
	int *p = arr;	// 数组名 -- 首元素的地址
	int i = 0;
	for(i = 0;i<10;i++){
	*(p+i) = 1;	// 把数组中的每个元素换成1
	}
    return 0;
}

总结:指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节),比如:char*的指针解引用就只能访问一个字节,而int*的指针的解引用就能访问4个字节。 

3.野指针

int a;    // 局部变量不初始化,默认是随机值
int *p;    // 局部的指针变量,就被初始化随机值

指针变量未初始化、指针越界访问、指针指向的空间被释放(取局部变量的地址),都会产生野指针 

3.1 如何规避野指针

1.指针初始化

#include <stdio.h>

int main()
{
	int b = 0;
	int a = 10;
	int *p = &a;	// 初始化
	int *p = NULL;	// NULL -- 用来初始化指针,给指针赋值
    return 0;
}

2.小心指针越界

3.指针指向空间释放,即使其置NULL

4.指针使用之前检查有效性

4.指针运算

  • 指针+-整数
  • 指针-指针

得到的为中间元素的个数

  • 指针的关系运算

指针可以比较大小

5.指针和数组

数组名为首元素的地址

#include <stdio.h>

int main()
{
   int arr[10] = {0};
   printf("%p\n", arr);
   printf("%p\n", &arr[0]);
   printf("%p\n", &arr);
   return 0;
}

// 1. &arr --&数组名,数组名不是首元素的地址,数组名表示整个数组
// &数组名,取出来的是整个数组的地址
// 2. sizeof(arr) --   sizeof(数组名)--数组名表示的整个数组
// --sizeof(数组名)计算的是整个数组的大小

6.二级指针

#include <stdio.h>

int main()
{
   int a = 10;
   int *pa = &a;
   int **ppa = &pa; // 二级指针
   return 0;
}

7.指针数组

存放指针的数组,本质为一个数组

#include <stdio.h>

int main()
{
   int a = 10;
   int b = 20;
   int c = 30;
   int *arr[3] = {&a, &b, &c};
   int i = 0;
   for (i = 0; i < 3; i++)
   {
      printf("%d\n", *(arr[i]));
   }

   return 0;
}
// 整型数组 --存放整型
// 字符数组 --存放字符
// 指针数组 --存放指针

猜你喜欢

转载自blog.csdn.net/qq_45355603/article/details/126143754