c语言可以不学吗指针吗,【C语言】学不会的指针

本文深入探讨了C语言中的指针概念,包括指针的声明、使用及空指针的应用。通过实例展示了如何通过指针访问和修改变量的值,以及如何将指针作为参数传递给函数。此外,还提到了指针在数组和函数调用中的作用,以及指针与内存管理的关系,帮助读者理解指针在C语言程序设计中的核心地位。
摘要由CSDN通过智能技术生成

指针

前言:

指针是C语言程序的核心,刚开始学指针,嗯....这样呀,貌似不难呀;之后开始用指针,&p,p,*p,**p,这些指针在用的时候,额.....什么东东?每次都要想半天,特别是遇到双重指针,脑子直接卡住;

什么是指针?

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

指针内在的关联

#include

int main()

{

int a;

int *p;

a = 1;

p = &a;

printf("变量a的内存地址是:0x%X \n",&a);

printf("变量a存储的值:%d \n",a);

printf("指针p的内存地址是:0x%X \n",&p);

printf("指针p存储的地址是:0x%X \n",p);

printf("指针p指向地址的值:%d \n",*p);

}

执行输出

变量a的内存地址是:0x24FE4C

变量a存储的值:1

指针p的内存地址是:0x24FE40

指针p存储的地址是:0x24FE4C

指针p指向地址的值:1

能把上面代码理解,那么指针基础内容也就掌握了;首先int a;a=1;声明一个int类型。声明一个变量就相当于申请一段存储空间,一个存储空间你要让我想办法找到它,好吧就给你一个起始地址(因为一段存储空间不止一位,所以给存储的起始地址来索引)。这个地址就是一个数字,假设我们这里的数字是0x24FE4C,这个数字就是a的内存地址;这块存储空间占用4个字节(int类型是4字节),而且存储的值为1。

e8481593141e14c22ae95427cd954a41.png

int *p; 就是声明一个指针变量, 存储的是一个地址,也可以说存储一个数字,这个数字代表计算机中存储器的位置。

p=&a; &a就是取a的地址(起始地址),a的起始地址是0x24FE4C,然后我们把这个数字赋值给p变量,现在p的值就是0x24FE4C。当然p是一段存储空间,它的地址是0x24FE40。

cd8461c4ca8b36a8a0845d0aea471283.png

p的值与a地址一致,可通过*p直接获取a地址存储的数据;获取可以那能不能赋值呢 ?

#include

int main()

{

int a;

int *p;

int b;

a = 1;

p = &a;

*p = 10;

printf("变量a存储的值:%d \n",a);

printf("变量a的内存地址是:0x%X \n",&a);

}

//变量a存储的值:10

//变量a的内存地址是:0x24FE44

很显然赋值可以生效,而且变量a的内存地址也进行了更改

根据代码整理出一张关系图,把关系图记到脑子里,之后看到指针能对应起来,想必指针也不是什么难事

空指针

在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。

NULL 指针是一个定义在标准库中的值为零的常量。请看下面的程序:

#include

int main ()

{

int *ptr = NULL;

printf("ptr 的地址是 %p\n", ptr );

return 0;

}

//ptr 的地址是 0000000000000000

在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。

如需检查一个空指针,您可以使用 if 语句,如下所示:

if(ptr) /* 如果 p 非空,则完成 */

if(!ptr) /* 如果 p 为空,则完成 */

传递指针给函数

C 语言允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。

下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值:

#include

#include

void getSeconds(unsigned long *par);

int main ()

{

unsigned long sec;

getSeconds( &sec );

/* 输出实际值 */

printf("Number of seconds: %ld\n", sec );

return 0;

}

void getSeconds(unsigned long *par)

{

/* 获取当前的秒数 */

*par = time( NULL );

return;

}

//Number of seconds: 1563865435

能接受指针作为参数的函数,也能接受数组作为参数,如下所示:

#include

/* 函数声明 */

double getAverage(int *arr, int size);

int main ()

{

/* 带有 5 个元素的整型数组 */

int balance[5] = {1000, 2, 3, 17, 50};

double avg;

/* 传递一个指向数组的指针作为参数 */

avg = getAverage( balance, 5 ) ;

/* 输出返回值 */

printf("Average value is: %f\n", avg );

return 0;

}

double getAverage(int *arr, int size)

{

int i, sum = 0;

double avg;

for (i = 0; i < size; ++i)

{

sum += arr[i];

}

avg = (double)sum / size;

return avg;

}

//Average value is: 214.400000

int func(int *p)  在函数中,此时的p表示一个内存地址,*p表示内存地址的值 记住!!

Swift3&period;0语言教程使用指针创建和初始化字符串

Swift3.0语言教程使用指针创建和初始化字符串 Swift3.0语言教程使用指针创建和初始化字符串苹果的Swift团队花了不少功夫来支持C的一些基础特性.C语言中为我们提供了指针,Swift也不例 ...

C语言中的指针数组

C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...

【ZZ】C 语言中的指针和内存泄漏 &amp&semi; 编写高效的C程序与C代码优化

C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...

GO语言中的指针

http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...

由链表初始化看C语言的二级指针

先来看C语言创建链表.插入节点和遍历链表的一段代码: #include #include typedef int ElemType; ...

C语言 &gt&semi; 数组和指针

C语言 数组和指针 const: 关于指针和const需要注意一些规则.首先,把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的. 然而,只能把非const数据的地 ...

C语言结构体指针的引用问题

在写栈的一个应用时遇见这样的一个问题 SqStack s; s->base = (int*)malloc(sizeof(int)*10); 通过这样一个代码引用的时候,会导致程序出现异常 经过一 ...

Go语言基础之指针

区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 Go语言中的函数传参都是值拷贝 ...

c语言之函数指针应用

c语言之函数指针应用 1.函数指针与指针函数 在开始运用函数指针前,我们需要将两个概念即:函数指针与指针函数搞清楚. 函数指针,指明这个一个函数,但返回值为指针类型,语法格式为: 类型名* 函数名A( ...

C语言中的指针笔记

C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...

随机推荐

Python策略模式实现源码分享

1.让一个对象的某个方法可以随时改变,而不用更改对象的代码 2.对于动态类型的Python语言,不需要定义接口 3.基本的实现方法:用类作为参数传递 例如: 12_eg3.py class Movea ...

003--VS2013 C&plus;&plus; 多边形绘制

//全局变量HPEN hPen;HBRUSH hBru;POINT poly1[6], poly2[5], poly3[5]; //---------------------------------- ...

WITH AS 优化逻辑读

SQL> select * from fxqd_list_20131115_new where (acct_no, oper_no, seqno, trans_amt) not in (sele ...

Android面试题总结(不定期更新、附答案)

1.Activity的启动模式? activity一共有4种启动模式:standard.singleTop singleTask .singleInstance standard:(标准模式)默认的就 ...

mac 下 ipython&plus;notebook

python做数据分析相关的工具的安装和配置,以及numpy的入门 为什么要用PYTHON来做数据分析 MATLAB R语言,语法类似C语言,但是它在语义上是函数设计语言,也是开源的. python ...

uoj&num;188&period; 【UR &num;13】Sanrd(Min&lowbar;25筛)

题面 传送门 题解 这是一道语文题 不难看出,题目所求即为\(l\)到\(r\)中每个数的次大质因子 我们考虑\(Min\_25\)筛的过程,设 \[S(n,j)=\sum_{i=1}^nsec_p( ...

redis-3&period;2&period;7安装脚本

redis-3.2.7 安装脚本 for CentOS 6.5 #!/bin/bash #Filename: inst_for_redis.sh #Version: 1.1 #Lastdate: 20 ...

Python线程,进程,携程,I&sol;O同步,异步

只有本人能看懂的-Python线程,进程,携程,I/O同步,异步 举个栗子: 我想get三个url,先用普通的for循环 import requests from multiprocessing im ...

Maven仓库国内镜像站

感谢阿里巴巴,搭建并公开了Maven仓库的国内镜像站.话外:使用Maven的官方仓库真的是太slow了! 在/conf/settings.xml中的

bit byte哪些事

1.bit 电脑中最小的计量单位,比如0或1代表一个bit,简称“位” 2.byte 电脑存储的基本单位.因为上面的bit小弟太小了,所以产生了byte.由8个bit存成了byte,最小为0最大为11 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值