详谈C语言指针

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int* p = &a;//*定义指针变量
	*p = 100;//*间接访问,解引用,a = 100
	p = &b;//p保存b的地址
	*p = 200;//b = 200
	int** pp = &p;//对指针取地址,二级指针
	*pp = &a;//解一次引用,一级指针p保存的值,即a的地址
	**pp = 1000;//解二次引用,a = 1000
	*pp = &b;//解一次引用,一级指针p保存的值,即b的地址
	**pp = 2000; // 解二次引用,b = 2000
	int*** ppp = &pp;//三级指针
	**ppp = &a;//解二次引用,一级指针p保存的值,即a的地址
	***ppp = 5000;//解三次引用,a = 5000
	**ppp = &b;//解二次引用,一级指针p保存的值,即b的地址
	***ppp = 6000;//解三次引用,b = 6000
	printf("%d", a);
	return 0;
}
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int* p1 = &a;
	int* p2 = &b;
	int* p3 = &c;
	*p1 = 100;
	*p2 = 200;
	*p3 = 300;
	*p3 = *p1 + *p2;
	*p3 = *p1 / *p2;
	*p3 += 1;
	printf("%d %d %d\n", *p1, *p2, *p3);//100,200,1
	return 0;
}
  • 指针的大小只与平台有关

32位sizeof( * )=4

64位sizeof( * )=8(字节)

#include<stdio.h>
void Swap_1(int* p1, int* p2)//p1,p2分别保存a和b的地址
{
	int *tmp = p1;//定义指针变量tmp,把p1的值(即a的地址)赋给tmp
	p1 = p2;//把p2的值(即b的地址)赋给p1
	p2 = tmp;//把tmp的值(即a的地址)赋给p2
}            //只交换地址,并没有更改值
#if 0
void Swap_2(int* p1, int* p2)
{
	int* tmp;//悬挂指针,野指针
	*tmp= *p1;
	*p1 = *p2;
	*p2 = *tmp;
}
#endif
void Swap(int* p1, int* p2)//p1,p2分别保存a和b的地址
{
	int tmp;
	tmp = *p1;//把p1解引用的值(即a的值)赋给tmp
	*p1 = *p2;//把p2解引用的值(即b的值),赋给p1解引用的值(即a的值)
	*p2 = tmp;//把tmp的值(即a的值)赋给把p2解引用的值(即b的值)
}             //完成交换。
int main()
{
	int a = 10;
	int b = 20;
	Swap(&a, &b);//主函数的改变要想影响到自定义函数:(1)必须传递指针,(2)必须解引用
	printf("%d,%d\n", a, b);
	return 0;
}
#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int* p = arr; p <= &arr[9]; p++)
	//for (int* p = arr; p < &arr[10]; p++)
	//for (int* p = &arr[9]; p >= &arr[0]; p--)
	//for (int* p = &arr[9]; p > &arr[-1]; p--)
	{
		printf("%d ", *p);
	}
	char a = 'x';
	char* p = &a;
	//int* np = &p;//指针类型不同
	return 0;
}
#include<stdio.h>
void Fun(int* p)
{
	//p = NULL;//空指针,p的值为0
	int* p1= p;//p1保存p的值
	int* p2 = NULL;//p2保存NULL
	int tmp;
	tmp = *p1;//把p1解引用的值(即p的值)赋给tmp
	*p1 = *p2;//把p2解引用的值(即NULL),赋给p1解引用的值(即p的值)
	*p2 = tmp;//把tmp的值赋给把p2解引用的值
}
int main()
{
	int a = 10;
	int* p = &a;
	Fun(p);
	//p = NULL;
	printf("%d\n", *p);
	return 0;
}

总结

assert()(需要头文件#include<assert.h>)

断定表达式一定为真,如果为假程序崩溃,并报告错误位置。

release面向用户版本:assert后面需要进行条件判断。

void* 通用指针,泛型指针

void*无数据类型,不参与运算,不能++和解引用

赋值 通用指针 = 特定指针 特定指针 = 通用指针
C++ char* p;
void* p1=p;
不可以
(char* p;
void* p1=p;
int* p2=p1
(p2=p)数据类型不同 )
C char* p;
void* p1=p;
void* p;
char* p2=p;

C++:NULL——0

C:NULL——((void*)0)

先有C后有C++,C++不支持void*赋值,故定义为0

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言指针基础详解

    目录 1.1:概述 1.1.1:内存 1.1.2:内存 1.1.3:指针和指针变量 1.2:指针基础知识 1.2.1:指针变量的定义和使用 1.2.2:通过指针间接修改变量的值 1.2.3:指针的大小 1.2.4:空指针与野指针 1.2.4:万能指针 1.3:指针与数组 1.3.1:数组名 1.3.2:指针操作数组 1.3.3:指针的加减运算 1.4:指针基础小结 1.5:总结 1.1:概述 1.1.1:内存 内存含义: 储存器:用来存储程序和数据,辅助CPU进行运算处理的重要组成部分. 内存:

  • C语言指针必备基础全面覆盖

    目录 前言 一.指针是什么? 1.数据在内存中的存储 2.一个小的单元到底是多大? 二.指针变量 1.什么是指针变量 2.指针类型 3.指针类型的作用 三.野指针 1.什么是野指针 2.野指针成因 2.1. 指针未初始化 2.2指针越界访问 2.3指针指向的空间释放 3.如何规避野指针 四.指针运算 1.指针±整数 2.指针-指针 五.指针和数组 1.数组元素的指针 2.通过指针引用数组元素 六.二级指针 七.指针数组 最后 前言 指针是C语言中的一个重要概念.正确而灵活的运用指针,可以使程序间

  • C语言智能指针之weak_ptr浅析

    目录 前言 使用环境 测试过程 现象分析 总结 前言 weak_ptr这个指针天生一副"小弟"的模样,也是在C++11的时候引入的标准库,它的出现完全是为了弥补它老大shared_ptr天生有缺陷的问题,其实相比于上一代的智能指针auto_ptr来说,新进老大shared_ptr可以说近乎完美,但是通过引用计数实现的它,虽然解决了指针独占的问题,但也引来了引用成环的问题,这种问题靠它自己是没办法解决的,所以在C++11的时候将shared_ptr和weak_ptr一起引入了标准库,用来

  • C语言函数指针详解

    目录 Introduction 函数指针 Function Pointers Exercise 1:qsort中的函数指针 Exercise 2: 总结 Introduction 上一个lab的主要内容为__data pointer__(指向数据的指针)可能在Linux系统中造成的__segmentation fault__.本次lab将考虑__function pointer__(指向函数/代码的指针)可能造成的错误:segfault或其他exceptions. 函数指针 Function P

  • C语言中的初阶指针详解

    目录 1.指针是什么 2.指针和指针类型 3.野指针 3.1野指针成因 3.2如何规避野指针 4.指针的运算 4.1指针±整数 4.2指针-指针 4.3指针的关系运算 5.指针和数组 6.二级指针 7.指针数组 ​ 总结 1.指针是什么 ​ 初学者都有一个疑问,那就是指针是什么?简单的说,就是通过它能找到以它为地址的内存单元. 地址指向了一个确定的内存空间,所以地址形象的被称为指针. int main() { int a = 10; int* pa = &a; return 0; } //pa是

  • C语言指针引用数组案例讲解

    前言:C语言中指针玩的是什么,是内存,要想学好指针的小伙伴们要先对数据在内存中是怎么玩的做一番了解~       当在程序中定义一个变量时,系统会根据其数据类型为其开辟内存空间,例如Visual C++为整型变量分配四个字节的空间,为单精度浮点型变量分配四个字节,为字符型变量分配一个字节,内存中每个字节都有自己独立且唯一的一个编号,这就是地址 ,如下图,系统为变量i分配了2000~2004的存储单元. _访问变量的方式_有如下图两种: 第一种直接访问方式,直接通过变量名访问,变量名与地址有一一对

  • 详谈C语言指针

    #include<stdio.h> int main() { int a = 10; int b = 20; int* p = &a;//*定义指针变量 *p = 100;//*间接访问,解引用,a = 100 p = &b;//p保存b的地址 *p = 200;//b = 200 int** pp = &p;//对指针取地址,二级指针 *pp = &a;//解一次引用,一级指针p保存的值,即a的地址 **pp = 1000;//解二次引用,a = 1000 *

  • C语言指针详解及用法示例

    新手在C语言的学习过程中遇到的最头疼的知识点应该就是指针了,指针在C语言中有非常大的用处.下面我就带着问题来写下我对于指针的一些理解. 指针是什么? 指针本身是一个变量,它存储的是数据在内存中的地址而不是数据本身的值.它的定义如下: int a=10,*p; p=&a int a=10; int *p=&a; 首先我们可以理解 int* 这个是要定义一个指针p,然后因为这个指针存储的是地址所以要对a取地址(&)将值赋给指针p,也就是说这个指针p指向a. 很多新手都会对这两种定义方法

  • Go语言指针访问结构体的方法

    本文实例讲述了Go语言指针访问结构体的方法.分享给大家供大家参考.具体分析如下: Go有指针,但是没有指针运算. 结构体字段可以通过结构体指针来访问.通过指针间接的访问是透明的. 复制代码 代码如下: package main import "fmt" type Vertex struct {     X int     Y int } func main() {     p := Vertex{1, 2}     q := &p     q.X = 1e9     fmt.P

  • Swift与C语言指针结合使用实例

    Objective-C和C的API常常会需要用到指针.Swift中的数据类型都原生支持基于指针的Cocoa API,不仅如此,Swift会自动处理部分最常用的将指针作为参数传递的情况.这篇文章中,我们将着眼于在Swift中让C语言指针与变量.数组和字符串共同工作. ####用以输入/输出的参数指针 C和Objective-C并不支持多返回值,所以Cocoa API中常常将指针作为一种在方法间传递额外数据的方式.Swift允许指针被当作inout参数使用,所以你可以用符号&将对一个变量的引用作为指

  • C 语言指针变量详细介绍

    数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量. 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.指针变量的值就是某份数据的地址,这样的一份数据可以是数组.字符串.函数,也可以是另外的一个普通变量或指针变量. 现在假设有一个 char 类型的变量 c,它存储了字符 'K'(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示).另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我

  • C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及对比 通俗理解数组指针和指针数组 数组指针: eg:int( *arr)[10]; 数组指针通俗理解就是这个数组作为指针,指向某一个变量. 指针数组: eg:int*arr[10]; 指针数组简言之就是存放指针的数组: --数组并非指针&&指针并非数组 (1)定义一个外部变量: eg:int value=10; int *p=&value; 举例:当需要在一个函数中用这个变量时:externa int*p;而非extern int p[]; 分析:当用:e

  • C语言指针应用简单实例

    C语言指针应用简单实例 这次来说交换函数的实现: 1. #include <stdio.h> #include <stdlib.h> void swap(int x, int y) { int temp; temp = x; x = y; y = temp; } int main() { int a = 10, b = 20; printf("交换前:\n a = %d, b = %d\n", a, b); swap(a, b); printf("交换

  • C语言 指针变量作为函数参数详解

    在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁. 像数组.字符串.动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合. 有的时候,对于整数.小数.字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值. 有些初学者可能会使用

  • C语言 指针与二维数组详解

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 0   1   2   3 4   5   6   7 8   9  10  11 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放 a[

  • C语言指针学习经验总结浅谈

    这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较费解的东西做一下讲解,希望能达到以下三个目的 1.通过写这些东西,把我脑袋中关于C的模糊的知识清晰化.2.给初转C的同事们一点提示和帮助.3.也希望各位前辈检查一下文档中是否有理解偏差的地方.1 指针的概念分解      指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: 1.指针的类型2.指

随机推荐