C语言简明介绍指针的使用

目录
  • 1. 指针类型
  • 2. 野指针
  • 3. 指针的运算
    • 3.1 指针+-整数
    • 3.2指针-指针
    • 3.3 指针的关系运算
  • 4. 指针数组

1. 指针类型

指针以字节为单位;

指针类型决定了解引用时能访问的空间的大小;也决定了指针的步长(指针+1走多远)

2. 野指针

  • 指针未初始化
  • 指针越界访问
  • 指针指向的空间已释放
int* test()
{
	int a = 10;//野指针
	return &a;
}
int main(){
	int* p =  test();
	//test函数里的a是局部变量,出函数时,储存变量的空间已经还给操作系统了
	printf("%d\n",*p);
	//此时通过解引用不能再访问到a;
}

如何规避野指针呢?

  • 指针初始化
  • 小心指针越界
  • 指针指向空间释放即使置NULL
  • 避免返回局部变量的地址
  • 指针使用之前检查有效性

3. 指针的运算

3.1 指针+-整数

	int arr[5] = {0,1, 2, 3, 4};
	int* p = arr;
	int i = 0;
	for(i=0; i<5; i++)
	{
		//printf("%d ",*p);
		//p++;
		printf("%d ",*p++);//以上两种写法相同
	}

3.2指针-指针

得到的是中间元素的个数,可以用来求字符串的长度

int my_strlen(char* arr)
{
	char* start = arr;
	char* end = arr;
	while(*end != '\0')
	{
		end++;
	}
	return end - start;
}

3.3 指针的关系运算

其实就是指针比较大小。实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。

	float values[5];
	float *vp;
	int i = 0;
	for (vp = &values[0]; vp < &values[5];)
	{
		*vp++ = 0;
	}

4. 指针数组

存放指针的数组

    int a; int b; int c;
	int* arr[3] = {&a,&b,&c};

到此这篇关于C语言简明介绍指针的使用的文章就介绍到这了,更多相关C语言指针内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-06-12

C语言深入讲解指针与结构体的使用

目录 1 啥是指针 1.1指针与指针变量 1.2总结 2 指针和指针类型 2.1指针+-整数 3 野指针 3.1 野指针的成因 1指针未初始化 2指针越界访问 3指针指向的空间释放 3.2 如何避免野指针的出现 4 二级指针 5 指针数组 6 结构体 6.1 结构的声明 6.2 结构体变量的定义和初始化 6.3 结构体的访问 6.4 结构体传参 1 啥是指针 刚刚接触指针的同学肯定会很懵逼,指针是啥啊?指南针哈哈,不和大家开玩笑,我们进行正题吧,指针是本质是就是地址,但我们要注意我们口头上常说的

C语言超详细讲解函数指针的运用

目录 前言 计算器的例子 回调函数 转移表 前言 前面我们学习了各种各样的指针类型,有些指针可以说是稀奇百怪,特别是函数指针,有些朋友可能觉得,函数指针有些多余,调用函数为什么要用指针调用,直接调用不好吗? 接下来我们从具体的实例来回答同学们的问题,加深对函数指针的理解. 计算器的例子 接下来我们写一个简单的计算器程序,完成不同的计算功能比如加减乘除: #include <stdio.h> //相加函数 int add(int a, int b) { return a + b; } //相减函

C语言中二级指针解析(指向指针的指针)

目录 二级指针(指向指针的指针) 二级指针的定义与理解 二级指针定义格式 二级指针赋值实例 二级指针(指向指针的指针) 指针可以指向一份普通类型的数据,例如 int.double.char 等,也可以指向一份指针类型的数据,例如 int *.double *.char * 等. 如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针. 假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示: 将这种关系转换为C语

C语言清楚了解指针的使用

目录 前言 字符指针 指针数组 数组指针 函数指针 前言 经过了指针的初步学习,我们了解了指针有以下特点: 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间. 2. 指针的大小是固定的4/8个字节(32位平台/64位平台). 3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限. 4. 指针的运算. 今天将要从各种不同的指针的角度切入,使得我们对指针的了解更加深入. 字符指针 我们现在已经学会下面的这种指针的使用了: int main() { char

c语言中的二级指针做函数参数说明

目录 二级指针做函数参数 二级指针作为形参简单实例分析 实例 一级指针二级指针做函数形参 下面看看实例 二级指针做函数参数 1.用指针做函数参数申请动态内存的问题 //如果函数参数是指针,不能用一级指针做函数参数实现申请动态内存   void getMemory(char *p, int num) {     p = (char *)malloc(sizeof(char)*num); } void main() {     char *str = NULL;     getMemory(str,

带你分分钟玩转C语言指针

目录 何为指针 数组指针 指针数组 字符串数组 数组指针的sao气操作 二级指针 函数指针 指针函数 文件指针 总结 何为指针 指针这玩意说白了,就是用来存储一个变量地址的东东 如图: (编辑器为vc2010) #include<stdio.h> void main(){ int a,*p; a=5; p=&a; printf("a=%d,p=%p,*p=",a,p,*p); getchar(); } 所以通过刚刚的情况,我们发现通过指针我们不仅可以获取一个变量的值

C语言超详细讲解指针的使用

目录 指针概述 自身类型 指向类型 代码例子 数值型指针 字符型指针 单字符 字符数组 字符串型指针 字符数组总结 指针概述 C语言中指针也可以认为是一种类型,不同于数值型和字符型的类型.推演过去指针变量也就是相当于不同的变量类型,不同于数值变量.字符型变量.字符串变量. 指针变量两种类型:自身类型和指向的类型 自身类型:将变量名去掉,剩下的就是指针变量类型. 指向类型:将变量名和离它最近的一个*去掉,剩下的类型就是指针指向的类型 int num = 10; int* p = NULL; p =

C语言简明分析指针与引用的具体用法

目录 1.指针 2.引用 1.指针 在计算机中,数据是存放在内存单元中的,一般把内存中的一个字节称为一个内存单元.为了更方便地访问这些内存单元,可预先给内存中的所有内存单元进行地址编号,根据地址编号,可准确找到其对应的内存单元.由于每一个地址编号均对应一个内存单元,因此可以形象地说一个地址编号就指向一个内存单元.C 语言中把地址形象地称作指针. 主要就是两个运算符:&和*. & 表示求地址,*表示求地址中的值,*也可以用来定义指针(int *p表示整型指针): int a=1; int *

Go语言中的指针运算实例分析

本文实例分析了Go语言中的指针运算方法.分享给大家供大家参考.具体分析如下: Go语言的语法上是不支持指针运算的,所有指针都在可控的一个范围内使用,没有C语言的*void然后随意转换指针类型这样的东西.最近在思考Go如何操作共享内存,共享内存就需要把指针转成不同类型或者对指针进行运算再获取数据. 这里对Go语言内置的unsafe模块做了一个实验,发现通过unsafe模块,Go语言一样可以做指针运算,只是比C的方式繁琐一些,但是理解上是一样的. 下面是实验代码: 复制代码 代码如下: packag

C++中指针和引用的区别分析

从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调

C/C++ 数组和指针及引用的区别

C/C++ 数组和指针及引用的区别 1.数组和指针的区别 (1)定义 数组是一个符号,不是变量,因而没有自己对应的存储空间.但是,指针是一个变量,里面存储的内容是另外一个变量的地址,因为是变量所以指针有自己的内存空间,只不过里面存储的内容比较特殊. (2)区别 a.对于声明和定义,指针和数组是不相同的,定义为数组,则声明也应该是数组,不可混淆 b.当作下标操作符时,指针和数组是等价的.a[i]会被编译器翻译成*(a+i). c.当数组声明被用作函数形参的时候,数组实际会被当作指针来使用. (3)

简单谈谈C++中指针与引用的区别

指针与引用是C++中两个很重要的概念,它们功能看过去很相似,就是都是间接引用某个对象,那么我们应该在什么时候使用指针,什么时候使用引用呢,下面请允许我慢慢道来: 1.永远不要使用一个指向空值的引用.一个引用必须始终指向某个对象,所以当你确定使用一个变量指向某个对象时,但是这个对象在某些时间可能指向控制,这时候你就必须把变量声明为指针类型,而不是引用!当你确定这个变量始终指向某个对象是,这时候你就可以把变量声明为引用类型. char *str=0; //设置指针为空值 char &s=*str;

浅谈JavaScript中的this指针和引用知识

this是javascript的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. this指针在传统OO语言中,是在类中声明的,表示对象本身.在JavaScript中,this表示当前上下文,即调用者的引用 ********this永远指向的是(函数对象)的所有者 this和全局对象: var a = 1; function foo(){ var b = 2; console.log(this.a+b);//3 } foo();

简单谈谈C++ 中指针与引用

指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作.但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此我详细介绍一下指针和引用,力争将最真实的一面展现给大家.如果我喷得不够好,希望嘴下留情.手下留命,还请指点一二:如果感觉还不错,请大家鼓掌. 指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过vo

C语言如何在指针中隐藏数据详解

前言 编写 C 语言代码时,指针无处不在.我们可以稍微额外利用指针,在它们内部暗中存储一些额外信息.为实现这一技巧,我们利用了数据在内存中的自然对齐特性. 内存中的数据并非保存在任意地址.处理器通常按照其字大小相同的块读取内存数据:那么考虑到效率因素,编译器会按照块大小的整数倍对内存中的实体进行地址对齐.因此在 32 位的处理器上,一个 4 字节整型数据肯定存放在内存地址能被4整除的地方. 下面,假设系统中整型数据和指针大小均为 4 字节. 现在有一个指向整型的指针.如上所述,整型数据可以存放在

深入理解c++指针的指针和指针的引用

展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i

C语言中函数指针的三种使用方法总结

 C语言中函数指针的三种使用方法总结 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长. 定义方式:int (*p)(int x, int y); 实现代码: #include <stdio.h> int sum(int x, int y){ return x + y; } int reduce(int x, int y){ return x - y; } int

python中引用与复制用法实例分析

本文实例讲述了python中引用与复制用法.分享给大家供大家参考.具体分析如下: 在python中,任何不可变对象是传值的,而可变对象是传引用的. 不管是向函数传递参数或者是任何形式的对象复制来说,不可变对象(比如整数,字符串)被真正复制,而可变对象只是复制了一个对他们的引用,即在内存中只有一份对象,而引用两份.   a=b 这样的赋值,就会创建对b的引用,对于象数字和字符串这样的不可变的对象,这种赋值实际是创建了b的一个副本 >>> a='hello' >>> b=a