首页 > 其他分享 >指针

指针

时间:2023-12-26 19:33:04浏览次数:26  
标签:arr return int 指针 include define

指针---不同指针类型的区别

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

指针+1代表了不同的类型+1跳过的不同字节

eg:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 0x11223344;
	/*int* pa = &a;//访问前四个
	*pa = 0;*/
	char* pc = &a;//访问第一个
	*pc = 0;
	return 0;
}

指针初始化区别

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };//定义一个整型数组10个元素全部初始化为0
	int* p = arr;//数组内每个元素为整型4个字节
	int i = 0;//一次定义一个元素,而使用char* arr的话十遍之后只能初始化前两个半元素,
	//char* p = arr;
	for (i = 0; i < 10; i++)//把十个内容都定义为1
	{
		*(p + i) = 1;
	}
	return 0;
}

野指针产生原因

1.指针未初始化--2.指针的越界访问--3.指针指向的空间释放

1.指针未初始化--

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a;//局部变量不初始化,默认为随机值
	int *p;//局部指针变量,没有初始化就被定义为随机值(地址随机)
	return 0;
}

2.指针的越界访问--

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[10] = {0};
	int* p = arr;
	int i = 0;
	for (i = 0; i < 12; i++)
	{
		p++;//当p++到数组空间外就成为了野指针
	}
	return 0;
}

3.指针指向的空间释放

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int* test()
{
	int a = 10;
	return &a;//返回的是地址就得需要用指针类型接收
}
int main()
{
	int *p=test();//定义指针类型
	*p = 20;//此时出了函数范围,a的地址空间已经被销毁,*p已经无法找到a的正确地址
	//此时*p已经成了野指针
	return 0;
}

如何避免出现野指针

1.指针初始化

2.小心指针越界

3.指针指向空间释放既使之值NULL

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

1.

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	//eg:指针初始化
	int a = 10;
	int* pa = &a;//可以直接进行初始化
	int* p = NULL;//实在不知道初始化可以先赋值给NULL

	return 0;
}

2.

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;
	*pa = 20;
	pa = NULL;//当使用完指针不想对其操作了,可以将其指向NULL,相当于断了之间的联系
	return 0;
}

指针运算(+)

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

指针-指针=中间的元素个数(数组)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p1 = &arr[0];
	int* p2 = &arr[9];
	printf("%d\n",&arr[9] - &arr[0]); //9,他们之间的元素个数
	printf("%d", *p2-*p1); //9,他们之间的元素个数
	return 0;
}

指针的关系大小

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define vp_tt 5
int main()
{
	float values[vp_tt];
	float* vp;
	for (vp = &values[vp_tt]; vp > &values[0];)
	{
		*--vp=0;//将数组前五个都设置为0
		printf("%c ",vp);
	}
	return 0;
}

标签:arr,return,int,指针,include,define
From: https://blog.51cto.com/u_16425777/8986729

相关文章

  • 函数指针 int (*add)( )
    原文首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址;intAdd(intx,inty){returnx+y;}intmain(){printf("%p\n",&Add);//打印一下函数Add()的地址printf("%p\n",Add);//数组名等于数组首元素地址,那函数名是等于函数地址吗?->等于!......
  • C语言: 函数 值传递 || 指针传递
    在C语言中,函数可以使用指针传递和值传递来传递参数。通常情况下,使用值传递是最常见和最简单的方式。在值传递中,函数的参数会被复制一份,然后传递给函数。这意味着在函数内对参数的修改不会对原始数据产生影响。当你只需要传递一个简单的数据类型,如整数或浮点数时,值传递是......
  • 116.+117. 填充每个节点的下一个右侧节点指针(Ⅰ+Ⅱ)(中)
    目录题目题解:BFS题目给定一个完美二叉树(117的Ⅱ题不是完美二叉树,是二叉树,其余一样),其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:structNode{intval;Node*left;Node*right;Node*next;}填充它的每个next指针,让这个指针指向其下一个右侧......
  • 【算法】双指针法
    还记得A-B=C问题吗?在之前,我们把原序列排好序,然后变成A=B+C问题,枚举每一个元素作A,然后再序列里如果存在B+C,必然是连续的一段(一个也是),我们利用二分法以O(logN)的时间复杂度获得左右边界相减即可。现在介绍另一种方法:双指针法。如上面说的,序列里如果存在B+C,必然是连续的一段。维护两......
  • 第 120 场双周赛(前缀和,双指针,树形dp+贪心)
     classSolution:deflargestPerimeter(self,nums:List[int])->int:nums.sort()n=len(nums)s=list(accumulate(nums))foriinrange(n-1,1,-1):ifnums[i]<s[i-1]:returnn......
  • C语言全局变量的extern+typedef函数指针+uvm_queue/pool/config_db/resource_db/barri
    C语言全局变量的extern全局变量在不同的文件引用,需要加上extern,才能引用到。如果没有extern关键词,则认为是一个定义,而不是引用,引发同名冲突。函数也是一样。要在本文件引用其它文件的函数,需要增补extern关键字。而其它文件,声明和定义过该函数。typedef函数指针https://zhuan......
  • c++智能指针和java垃圾回收对比
    c++智能指针和java垃圾回收对比我们都知道C++和java语言的一个巨大差异在于垃圾回收方面,这也是C++程序开发者和java程序开发者之间经常讨论的一个话题。在C++语言中,一般栈上的内存随着函数的生命周期自动进行回收,但是堆上内存(也就是自己new/malloc出来的空间),需要自己手动进行del......
  • C++(指针常量、常量指针)
    在C++中,常量指针和指针常量是两个不同的概念,它们涉及到指针和常量的组合。让我们来详细解释它们的含义:常量指针(ConstantPointer):一个常量指针是指针本身是常量,它指向的内容可以被修改。一旦指针被初始化指向某个变量,就不能再指向其他变量。通过指针可以修改所指向的变量的......
  • 双指针算法-最长不重复子序列
    思路这里的i才是主要的遍历指针,j是用来剔除元素以满足题目要求的。代码#include<iostream>usingnamespacestd;constintN=1e5+10;intn,res;inta[N],s[N];intmain(){cin>>n;for(inti=0;i<n;i++)cin>>a[i];for(int......
  • PTA|C语言|指针
    计算最长的字符串长度本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。函数接口定义:intmax_len(char*s[],intn);其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。裁判测试程序样例:#include<stdio.h>#include<string.h>#include......