C语言--指针
创始人
2025-05-31 12:39:50
0

目录

      • 1、指针
        • 1.1 什么是指针?
        • 1.2 指针的NULL
        • 1.3 指针的比较 > < ==
        • 1.4 指针数组
        • 1.5 传递指针 / 数组 给函数
        • 1.6 从函数返回指针【返回局部变量的地址,static】
        • 1.7 指向指针的指针

1、指针

1.1 什么是指针?

指针也就是内存地址,指针变量是用来存放内存地址的变量。 就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

在这里插入图片描述

  • 说到底指针就只存在:地址 、值,不是地址就是值。数组中的方框只是虚拟的,方便观看的。唯一的对应关系就是 “地址–值”
#include 
int main ()
{int  var = 20;int  *ip;        // 声明一个变量,存放的是整数指针int* (即地址)ip = &var;  // 取址printf("var 变量的地址: %p\n", &var  );printf("ip 变量存储的地址: %p\n", ip );printf("*ip 变量的值: %d\n", *ip );return 0;
}
var 变量的地址: 0x7ffeeef168d8
ip 变量存储的地址: 0x7ffeeef168d8
*ip 变量的值: 20

1.2 指针的NULL

#include 
int main ()
{int  *ptr = NULL;printf("ptr 的地址是 %p\n", ptr);return 0;
}
ptr 的地址是 0x0

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


1.3 指针的比较 > < ==

#include 
const int MAX = 3;
int main()
{int  var[] = {10, 100, 200};int  i, *ptr;ptr = var;for (i = 0; i < MAX; i++){printf("存储地址:var[%d] = %p\n", i, ptr);printf("存储值:var[%d] = %d\n", i, *ptr);ptr++;}return 0;
}
存储地址:var[0] = e4a298cc
存储值:var[0] = 10
存储地址:var[1] = e4a298d0  //一个int占4个字节,要是一个字符就占一个字节
存储值:var[1] = 100
存储地址:var[2] = e4a298d4
存储值:var[2] = 200
#include 
const int MAX = 3;
int main ()
{int  var[] = {10, 100, 200};int  i, *ptr;ptr = var; // 指针中第一个元素的地址i = 0;while (ptr <= &var[MAX - 1]){printf("存储地址:var[%d] = %p\n", i, ptr );printf("存储值:var[%d] = %d\n", i, *ptr );ptr++;i++;}return 0;
}

1.4 指针数组

int *ptr[MAX];

在这里,把ptr声明为一个数组,由MAX个整数指针组成。因此,ptr 中的每个元素,都是一个指向 int 值的指针(地址)。

#include 
const int MAX = 3;
int main ()
{int  var[] = {10, 100, 200};int i, *ptr[MAX];for ( i = 0; i < MAX; i++){ptr[i] = &var[i];  /* 赋值为整数的地址 */}for ( i = 0; i < MAX; i++){printf("Value of var[%d] = %d\n", i, *ptr[i] );}return 0;
}
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200

1.5 传递指针 / 数组 给函数

#include 
#include 
// 函数声明
void getSeconds(unsigned long *par);int main ()
{unsigned long sec;getSeconds( &sec );  // 对sec赋值 -> 传地址;不是复制printf("Number of seconds: %ld\n", sec);return 0;
}
void getSeconds(unsigned long *par)
{*par = time( NULL );  // 获取当前的秒数, 地址--值, 赋值return;
}
Number of seconds :1294450468

————
将数组转换为指针:arr[5], 其中5加在指针上,右移指针;[]为取值,作用等同 *p 取值。

#include // 函数声明
double getAverage(int *arr, int size);int main ()
{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.40000

1.6 从函数返回指针【返回局部变量的地址,static】

C 语言不支持在调用函数时返回局部变量的地址,除非定义局部变量为 static 变量。

#include 
#include 
#include  int * getRandom( )
{static int  r[10]; // 函数返回局部变量的地址,要加static,为什么加了就可以?int i;/* 设置种子 */srand( (unsigned)time( NULL ) );for ( i = 0; i < 10; ++i){r[i] = rand();printf("%d\n", r[i] );}return r;
}int main ()
{int *p;int i;p = getRandom();for ( i = 0; i < 10; i++ ) {printf("*(p + [%d]) : %d\n", i, *(p + i));  // 地址--值; 地址移动+取值}return 0;
}
1523198053
1187214107
1108300978
430494959
1421301276
930971084
123250484
106932140
1604461820
149169022
*(p + [0]) : 1523198053
*(p + [1]) : 1187214107
*(p + [2]) : 1108300978
*(p + [3]) : 430494959
*(p + [4]) : 1421301276
*(p + [5]) : 930971084
*(p + [6]) : 123250484
*(p + [7]) : 106932140
*(p + [8]) : 1604461820
*(p + [9]) : 149169022

1.7 指向指针的指针

相关内容

热门资讯

横七竖八,横七竖八的意思,横... 横七竖八héng qī shù bā [释义]有的横着;有的竖着。形容杂乱无章;没有条理。[语...
容头过身的近义词 容头过身的近义词有:得过且过,容头过身[róng tóu guò shēn]的意思:只要头容得下,身...
坚壁清野的近义词 坚壁清野的近义词有:固壁清野,空室清野,闭壁清野,坚壁清野[jiān bì qīng yě]的意思:...
讨厌的近义词 讨厌的近义词  中文发音:讨厌[tǎo yàn]  词语解释:谓事情麻烦,令人心烦。惹人厌恶。  近...
通都大邑的近义词 通都大邑的近义词有:沃野千里,通天大邑,通衢大邑,通邑大都,通都大埠,通都巨邑,通都大邑[tōng ...
盲翁扪籥的近义词 盲翁扪籥的近义词有:盲人扪烛,盲翁扪龠,盲翁扪籥[máng wēng mén yuè]的意思:比喻只...
解甲释兵的近义词 解甲释兵的近义词有:解兵释甲,解甲释兵[jiě jiǎ shì bīng]的意思:解:解除;释:卸下...
重峦复嶂的近义词 重峦复嶂的近义词有:重峦叠嶂,重峦叠巘,重峦复嶂[zhòng luán fù zhàng]的意思:同...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
清静的反义词   一、【反义词】  喧嚣、嘈杂、吵杂、烦扰、烦嚣  二、【基本解释】  [释义](形)(环境)安静...
毫无疑义的近义词及意思 毫无疑义的近义词及意思毫无疑义近义词: 不容置疑( 注释:不允许有什么怀疑。表示论证严密,无可怀疑。...
贯通的近义词是什么   新知识会以新颖、或许奇妙的方式与旧知识融会贯通。下面是小编收集整理的贯通的近义词,希望对您有所帮...
乔太守乱点鸳鸯谱的近义词 乔太守乱点鸳鸯谱的近义词有:乱点鸳鸯谱,乔太守乱点鸳鸯谱[qiáo tài shǒu luàn di...
移动应用架构设计:如何转变开发... 移动应用架构设计:如何转变开发流程 2023 年掌握移动应用程序架构的指南࿰...
计算机组成原理实验1---运算...     本实验为哈尔滨工业大学计算机组成原理实验,实验内容均为个人完成,...
八面威风的近义词及意思 八面威风的近义词及意思八面威风近义词: 八面威风( 注释:威风:令人敬畏的'气势。各个方面都很威风。...
英雄无用武之地的近义词 英雄无用武之地的近义词有:怀才不遇,英雄无用武之地[yīng xióng wú yòng wǔ zh...
弃文就武的近义词 弃文就武的近义词有:弃文竞武,弃笔从戎,投笔从戎,弃文就武[qì wén jiù wǔ]的意思:放弃...
徒拥其名的近义词 徒拥其名的近义词有:徒拥虚名,徒有虚名,徒拥其名[tú yōng qí míng]的意思:徒:只。空...
Blender教程利用Cell...   推荐:将 NSDT场景编辑器 加入你的3D开发工具链 效果图 一、Cell F...