C语言浅析指针的使用

目录
  • 指针
  • 等价形式转换
  • 函数指针
  • 主函数

指针

指针是一个变量

(1) 作用:只能存储地址的值

(2) 大小:32位操作系统中占4字节;64位操作系统中占8字节

(3) 取地址:&

(4) 运算:可进行加、减法操作

示例:

  • 定义一个指针变量 p
  • 初始化
  • 赋值为 5

二级指针:指向指针的指针

int a;
//一级指针变量
int *p = &a;
*p = 5;
//二级指针
int **k;
//存储一级指针变量的地址
k = &p;

等价形式转换

  • *p <=> a(原始变量)
  • p+1 <=> &p[1]
  • p->filed <=> (*p).filed <=> a.filed
#include<stdio.h>
#define print(func){\
	printf("%s = %d\n", #func, func);\
}
struct Data {
	int x, y;
};
int main(){
	struct Data a[2], *p = a;
	//初始化
	a[0].x = 0, a[0].y = 1;
	a[1].x = 2, a[1].y = 3;
	//用尽可能多的形式表示a[1].x  --> 3
	print(a[1].x);
	print((&a[1])->x);
	print((a+1)->x);
	print((&a[0] + 1)->x);
	print((*(&a[1])).x);
	print((*(a + 1)).x);
	print((*(&a[0] + 1)).x);
	print(p[1].x);
	print((&p[1])->x);
	print((p+1)->x);
	print((&p[0] + 1)->x);
	print((*(&p[1])).x);
	print((*(p + 1)).x);
	print((*(&p[0] + 1)).x);
	return 0;
}

函数指针

typedef 的用法

内建类型的重命名:

typedef long long lint;

typedef char * pchar;

结构体类型的重命名:

typedef struct __node{

int x, y;

} Node, *PNode;

函数指针命名:

typedef int (*func)(int);

主函数

int main();

int main(int argc, char *argv[]);

(1) argc :命令行参数个数

(2) argv:本质上为一个一维的数组,存储字符型指针

(3) char * :字符数组的首地址

(4) 结合(1)(2)可得,char *argv[]为二维字符数组,表示具体的命令行参数,根据空格或 \t分割参数

int main(int argc, char *argv[], char **env);

(1) char **env为二级指针

(2) env 是一个指针变量,存的是另一个指针的地址

(3) char **env 也是 二维字符数组 ,表示环境变量

#include<stdio.h>
int main(int argc, char *argv[], char **env){
	printf("argc = %d\n", argc);
	for(int i = 0;i < argc; i++){
		printf("argv[%d] = %s \n ", i, argv[i]);
	}
	for(int i = 0; env[i]; i++){
		printf("env[%d] = %s\n", i, env[i]);
	}
	return 0;
}

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

(0)

相关推荐

  • C语言返回值指针的函数详解

    #include<stdio.h> void main() { int a[5] = { 1,3,5,7,9 }; int* name[5] = { &a[0],&a[1],&a[2] ,&a[3] ,&a[4] }; int i; for (i = 0; i < 5; i++) { printf("%d ", *name[i]); } printf("\n\n"); } #include<stdio.

  • C语言的数组指针与函数指针详解

    目录 前言 函数指针语法 数组指针与指针数组 总结 前言 数组指针和函数指针都是C语言比较难的知识点,尤其是函数指针,并且函数指针在开发中有着巨大的作用. 函数指针语法 定义一个函数指针,并通过函数指针间接调用函数: int get_num(int a, int b) { return a + b; } int (*func)(int a, int b); //定义了一个函数指针func,它指向 返回值为int 参数为 int a, int b的函数 func = &get_num; //函数指

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

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

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

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

  • C语言全方位讲解指针与地址和数组函数堆空间的关系

    目录 一.一种特殊的变量-指针 二.深入理解指针与地址 三.指针与数组(上) 四.指针与数组(下) 五.指针与函数 六.指针与堆空间 七.指针专题经典问题剖析 一.一种特殊的变量-指针 指针是C语言中的变量 因为是变量,所以用于保存具体值 特殊之处,指针保存的值是内存中的地址 内存地址是什么? 内存是计算机中的存储部件,每个存储单元有固定唯一的编号 内存中存储单元的编号即内存地址 需要弄清楚的事实 程序中的一切元素都存在于内存中,因此,可通过内存地址访问程序元素. 内存示例 获取地址 C语言中通

  • C语言详解函数与指针的使用

    目录 一.函数类型 二.函数指针 三.回调函数 四.小结 一.函数类型 C 语言中的函数有自己特定的类型 函数的类型由返回值,参数类型和参数个数共同决定,如 int add(int i, int j)的类型为 int(int, int) C 语言中通过 typedef 为函数类型重命名 typedef type name(parameter list) 如 typedef int f(int, int); typedef void p(int); 二.函数指针 函数指针用于指向一个函数 函数名是

  • C语言进阶教程之函数指针详解

    目录 一.函数指针 1.概念 1.2函数指针的使用方法 1.3练习巩固 1.4小结一下 二.阅读两段有趣的代码 1.( *(void( *)( ))0 )( ) 2.void (* signal(int,void( * )( int ) ) )(int) 附:函数指针的应用——函数回调 总结 一.函数指针 1.概念 函数指针:首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址: 请看示例: int main(){ int a = 10; int*pa = &a; char ch

  • C语言函数指针数组实现计算器功能

    目录 一.概念 二.用途 三.案例:计算器 (1)基础代码编译: (2)使用函数指针数组的实现: 一.概念 数组:一个存放相同类型数据的存储空间. int arr[10]; //数组arr的每个元素是int 指针数组:一个存放指针的数组. int* arr[10]; //数组arr的每个元素是int* 函数指针:一个指向函数的指针,一般用函数名表示. int Add(int x, int y) { return x + y; } int main() { int arr[10] = { 1, 2

  • C语言浅析指针的使用

    目录 指针 等价形式转换 函数指针 主函数 指针 指针是一个变量 (1) 作用:只能存储地址的值 (2) 大小:32位操作系统中占4字节:64位操作系统中占8字节 (3) 取地址:& (4) 运算:可进行加.减法操作 示例: 定义一个指针变量 p 初始化 赋值为 5 二级指针:指向指针的指针 int a; //一级指针变量 int *p = &a; *p = 5; //二级指针 int **k; //存储一级指针变量的地址 k = &p; 等价形式转换 *p <=> a

  • C语言的指针类型详细解析

    指针存储了内存的地址,同时指针是有类型的,如int*,float*,那么,一个自然的猜想就是指针变量应该存储这两方面的信息:地址和指针类型,比如,就像下面的结构体: 复制代码 代码如下: struct pointer{    long address;    int type;} 举个例子:打印sizeof(int*),值为4,可见4字节是存储内存地址用的,反过来就说明指针并没有存储类型信息的地方,那么指针的类型信息存放在哪儿呢?下面剖析一段简单的代码. 复制代码 代码如下: // ma.cpp

  • C语言 二级指针详解及示例代码

    指针可以指向一份普通类型的数据,例如 int.double.char 等,也可以指向一份指针类型的数据,例如 int *.double *.char * 等. 如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针. 假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示: 将这种关系转换为C语言代码: int a =100; int *p1 = &a; int **p2 = &p1; 指针变量也是一种变量

  • C语言 数组指针详解及示例代码

    数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, 15, 100, 888, 252 };为例,该数组在内存中的分布如下图所示: 定义数组时,要给出数组名和数组长度,数组名可以认为是一个指针,它指向数组的第 0 个元素.在C语言中,我们将第 0 个元素的地址称为数组的首地址.以上面的数组为例,下图是 arr 的指向: 下面的例子演示了如何以指针的方

  • 对C语言中指针的理解与其基础使用实例

    C语言的指针,关键意思在于"指". "指"是什么意思? 其实完全可以理解为指示的意思.比如,有一个物体,我们称之为A.正是这个物体,有了这么个称谓,我们才能够进行脱离这个物体的实体而进行一系列的交流.将一个物体的指示,是对这个物体的抽象.有了这种抽象能力,才有所谓的智慧和文明.所以这就是"指示"这种抽象方法的威力. 退化到C语言的指针,指针是一段数据/指令(在冯诺易曼体系中,二者是相通,在同一空间中的)的指示.这是指示,也就是这段数据/指令的起始

  • C语言 字符串指针详解及示例代码

    C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在<C语言字符数组和字符串>中已经进行了详细讲解,这里不妨再来演示一下: #include <stdio.h> int main(){ char str[] = "http://c.biancheng.net"; int len = strlen(str), i; //直接输出字符串 printf("%s\n", str); //每次输出一个字符 for(i=0; i<

  • C语言 函数指针(指向函数的指针)详解

    一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数.这种指针就是函数指针. 函数指针的定义形式为: returnType (*pointerName)(param list); returnType 为函数返回值类型,pointerNmae 为指针名称,param list 为函数参数列表.参数列表中

  • Go 语言的指针的学习笔记

    Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, func . 相比 Java,Python,Javascript 等引用类型的语言,Golang 拥有类似C语言的指针这个相对古老的特性.但不同于 C 语言,Golang 的指针是单独的类型,而不是 C 语言中的 int 类型,而且也不能对指针做整数运算.从这一点看,Golang 的指针基本就是一种引用

  • C语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解

    初学者在学习C语言的时候,最头疼的可能就是指针,话不多说.让我们直接进入正题 直接上代码 int main(void) { int *p = 0; printf("%d", *p); system("pause"); return 0; } 直接运行,好了,程序是不是报错了?那就对了.因为此时的int *p=0实际等于int *p; p=0; 让我们来验证一下对不对 int main(void) { int *p = 0; printf("%d"

  • C语言:利用指针编写程序,用梯形法计算给定的定积分实例

    题目要求 利用指针编写程序,用梯形法计算下列公式中的定积分: 参考代码 首先说明一下指针的用处:因为所传递的参数均为数字,并不需要使用指针提高效率,故这里使用指针指向函数. 请注意calc()函数中的这一语句: double(*pfunction)() = &function; 即实现了我所描述的过程. 代码如下: #include <stdio.h> #include <math.h> double function(double x){ return (double)(

随机推荐