【C和指针】带你领略C语言最有灵魂的内容(上)

        大家好,我是想要慢慢变得优秀的向阳同学‍,从今天开始逐渐恢复更新状态,想学习计算机知识的小伙伴可以支持一下哦!~不能说肯定是干货,但会让你有所收获!

快乐地生活在这个世界上,你不需要取悦于任何人,做最好的自己。

目录

指针类型

案例1:

案例二:

指针和数组

野指针

野指针出现的原因

️️1.指针未初始化️️

2.指针越界访问

如何避免野指针问题

指针运算

指针+- 整数

指针-指针

指针的关系运算

二级指针


  • 如果你想从头开始认识或者复习指针,可以看一下我之前写的文章
  • 【最受欢迎最容易理解的初阶c语言教学】5.指针和结构体_想要慢慢变得优秀的向阳的博客-CSDN博客

指针类型

指针作为储存变量地址的变量,也是具有类型的。

char  *pc = NULL;
int   *pi = NULL;
short *ps = NULL;
long  *pl = NULL;
float *pf = NULL;
double *pd = NULL;

那么这些指针变量的类型有什么意义呢?

  1. 指针的类型决定了指针向前或者向后走一步有多大(距离)
  2. 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)

先给出结论,再让我们看看接下来的案例


案例1:

#include
int main()
{
	    int n = 10;
		char* pc = (char*)&n;
		int* pi = &n;

		printf("%p\n", &n);
		printf("%p\n", pc);
		printf("%p\n", pc + 1);
		printf("%p\n", pi);
		printf("%p\n", pi + 1);

	return 0;
}

【C和指针】带你领略C语言最有灵魂的内容(上)_第1张图片

  1. char*类型的指针经过整数加减,改变1个字节
  2. int*   类型的指针经过整数加减,改变4个字节

案例二:

#include 
int main()
{
	int n = 0x11223344;
	int m = 0x11223344;
	char* pc = (char*)&n;
	int* pi = &m;
	*pc = 0; 
	*pi = 0; 
	return 0;
}

【C和指针】带你领略C语言最有灵魂的内容(上)_第2张图片

  1. char*类型的指针经过解引用,操作了1个字节
  2. int*   类型的指针经过解引用,操作了4个字节

指针和数组

  • 这个内容细讲起来比较多,可以看下面的链接文章
  • 【指针和数组名】一篇文章搞懂它们之间的暧昧关系_想要慢慢变得优秀的向阳的博客-CSDN博客

野指针

  • 概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

野指针出现的原因

️️1.指针未初始化️️

#include 
int main()
{ 
 int *p;//局部变量指针未初始化,默认为随机值
    *p = 20;
 return 0; }

2.指针越界访问

#include 
int main()
{
    int arr[10] = {0};
    int *p = arr;
    int i = 0;
    for(i=0; i<=11; i++)
   {
        //当指针指向的范围超出数组arr的范围时,p就是野指针
        *(p++) = i;
   }
    return 0; }

如何避免野指针问题

  • 在使用指针前,要做到一下三个步骤即可。
#include
int main()
{
	int* p = NULL;//初始化时不知道指向哪的时候或者使用完后要赋值为NULL
	if ( p!= NULL)//经过之前的赋值,下次代码写的多,哪怕忘了是否为野指针
		          //用一下判断再解引用指针
	{
		*p = 20;
	}

	return 0;
}

指针运算


指针+- 整数

#include
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

【C和指针】带你领略C语言最有灵魂的内容(上)_第3张图片


指针-指针

int my_strlen(char *s) {
       char *p = s;
       while(*p != '\0' )
              p++;
       return p-s; }
  • 前提是两个指针必须指向一块地址

指针的关系运算

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int *i = arr; i < &arr[10]; i++)
	{
		printf("%d ", *i);
	}
	return 0;
}

【C和指针】带你领略C语言最有灵魂的内容(上)_第4张图片

【C和指针】带你领略C语言最有灵魂的内容(上)_第5张图片

  •  关系运算就是说,两个指针可以比较大小做判断

二级指针

  • 概念:指针变量也是变量,是变量就有地址,那指针变量的地址存放的地方就是二级指针

【C和指针】带你领略C语言最有灵魂的内容(上)_第6张图片

int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
	printf("%d\n", a);
	printf("%d\n", *p);
	printf("%d\n", * *pp);
	return 0;
}

【C和指针】带你领略C语言最有灵魂的内容(上)_第7张图片

【C和指针】带你领略C语言最有灵魂的内容(上)_第8张图片

【C和指针】带你领略C语言最有灵魂的内容(上)_第9张图片

你可能感兴趣的:(c语言,c语言,c++,后端,经验分享,开发语言)