首页 > 编程语言 >STLG_01_09_程序设计C语言 - 指针

STLG_01_09_程序设计C语言 - 指针

时间:2025-01-04 22:03:00浏览次数:3  
标签:10 STLG 01 指向 int 09 arr 内存地址 指针

        C语言中的指针是一个非常重要的概念,它允许程序直接访问和操作内存地址。理解指针对于掌握C语言编程至关重要。

1. 指针的基本概念

  • 指针:指针是一个变量,它存储的是另一个变量的内存地址。
  • 指针变量:指针变量专门用来存储内存地址。

2. 指针的声明与初始化

2.1 指针的声明

声明一个指针变量时,需要指定它指向的变量的数据类型。声明格式如下:

数据类型 *指针变量名;

例如,声明一个指向int类型变量的指针:

int *p;

2.2 指针的初始化

指针变量可以被初始化为某个变量的地址。使用&操作符获取变量的地址。例如:

int x = 10;
int *p = &x;  // p指向x的地址

3. 指针的使用

3.1 解引用指针

使用*操作符可以访问指针所指向的内存地址中的值。例如:

int x = 10;
int *p = &x;
int y = *p;  // y的值为10

3.2 修改指针指向的值

使用*操作符可以直接修改指针所指向的内存地址中的值。例如:

int x = 10;
int *p = &x;
*p = 20;  // x的值变为20

4. 指针的算术运算

指针可以进行加减运算,以指向相邻的内存地址。例如:

int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;  // p指向数组的第一个元素
p++;  // p现在指向arr[1]

5. 指针与数组

数组名本质上是一个指向数组第一个元素的指针。例如:

int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;  // p指向arr[0]

6. 指针与函数

6.1 指针作为函数参数

指针可以作为函数参数,允许函数修改调用者中的变量值。例如:

void increment(int *p) {
    (*p)++;
}

int main() {
    int x = 10;
    increment(&x);  // x的值变为11
    return 0;
}

6.2 返回指针的函数

函数可以返回指针。例如:

int *getMax(int *a, int *b) {
    return (*a > *b) ? a : b;
}

int main() {
    int x = 10, y = 20;
    int *max = getMax(&x, &y);  // max指向y
    return 0;
}

7. 指针与动态内存分配

使用malloccallocreallocfree函数可以动态分配和释放内存。例如:

int *p = (int *)malloc(sizeof(int) * 5);  // 分配5个整数的内存
if (p != NULL) {
    // 使用p
    free(p);  // 释放内存
}

8. 空指针与无效指针

  • 空指针:空指针不指向任何有效的内存地址,通常用NULL表示。
int *p = NULL;

  • 无效指针:未初始化的指针或已经释放的指针称为无效指针,访问无效指针会导致未定义行为。

9. 指针数组与数组指针

  • 指针数组:存储指针的数组。例如:
int *arr[3];  // 包含3个指向int的指针

  • 数组指针:指向数组的指针。例如:
int (*p)[3];  // 指向包含3个int的数组的指针

10. 多级指针

指向指针的指针称为多级指针。例如:

int x = 10;
int *p = &x;
int **pp = &p;  // pp是指向p的指针

11. 函数指针

函数指针指向一个函数,可以用来调用函数。例如:

int add(int a, int b) {
    return a + b;
}

int (*func_ptr)(int, int) = add;  // func_ptr指向add函数
int result = func_ptr(10, 20);  // 调用add函数

总结

C语言的指针功能强大且灵活,但也容易出错。正确理解和使用指针需要大量的练习和经验。掌握了指针,你将能够编写更高效、更灵活的C程序。

标签:10,STLG,01,指向,int,09,arr,内存地址,指针
From: https://blog.csdn.net/cdlislxjt/article/details/144935853

相关文章

  • 【无人机协同】遗传算法GA同构异构无人机UAV协同搜索【含Matlab源码 10916期】
    ......
  • [AHOI2018初中组] 球球的排列
    前言紫题,启动!思路转化题意对于\(n\)个物品,每个物品拥有特征值\(a_i\),其编号为\(i\)一个合法的排列定义为:\(\foralli\in[1,n),a_{p_i}\cdota_{p_i+1}\)不是一个完全平方数求合法排列的数量这个题听别人讲过,一如既往地忘掉了怎么做呢?看了下......
  • 2025.01.04模拟赛
    今天也是……他的生日拖着个不清醒的脑子就来打了。开局奶龙暴击。T1本来想的贪心,结果发现贪心的复杂度只能拿10分(且貌似假了)。然后开始思考。想到区间,想到\(cnt\)数组双指针。然后脑子抽抽想不出来了。问了下sxht大巨,恍然大明白写出来了。嘻嘻然后打暴力。那种脑子被封印......
  • Gitlab的备份与恢复,异机转移.240109
    ​注意:异机转移的时候,gitlab的版本必须一致。一、备份GitLab数据停止GitLab服务gitlab-ctlstopunicorngitlab-ctlstopsidekiq创建GitLab备份mkdirgitlabBackgitlab-rakegitlab:backup:createBACKUP=gitlabBak230815cd/var/opt/gitlab/backups/mvgitlabBak......
  • 2025-01-04:不包含相邻元素的子序列的最大和。用go语言,给定一个整数数组 nums 和一个由
    2025-01-04:不包含相邻元素的子序列的最大和。用go语言,给定一个整数数组nums和一个由二维数组queries组成的查询列表,其中每个查询的格式为queries[i]=[posi,xi]。对于每个查询i,首先将nums[posi]的值更新为xi,然后计算在这一更新后,数组nums中所有不包含相邻元素的子序......
  • 20241401 《计算机基础与程序设计》 课程总结
    班级链接2024计算机基础与程序设计作业要求第十五周作业每周作业汇总第一周作业链接简要内容:对计算机的程序、原理、语言进行基本的了解与认识第二周作业链接简要内容:了解计算系统的宏观分层,数字化,信息安全第三周作业链接简要内容:①数字分类与计数法位......
  • P5680 [GZOI2017] 共享单车 题解
    题目传送门前置知识最短路|最近公共祖先|虚树解法题目中所说的回收路线树即以\(k\)为根节点的最短路径树,可以使用Dijkstra构建。标记回收区域本质上是对回收区域构建虚树,然后就和luoguP2495[SDOI2011]消耗战基本一致了,根据儿子节点的投放状态进行树形D......
  • 工资收入预测项目01
    1.项目选题使用美国人口普查收入数据集,根据人口普查数据预测个人收入是否每年超过50,000美元。数据集:adult任务分析意义:通过分析人口工资情况,可以揭示不同人口特征与收入水平之间的关系,这对于理解社会经济结构、制定公共政策以及优化资源分配具有重要意义。例如,可以帮助......
  • 打卡信奥刷题(540)用C++信奥P7060[普及组/提高]P7060 [NWRRC2014] Alarm Clock
    [NWRRC2014]AlarmClock题面翻译Alice梦见了一个时间,但她只记得了这个时间在电子钟上显现出来的段数,现在给出这个段数,让你反推Alice梦见的时间(若有多个答案,输出任意一个均可)段数:想必大家都听说过用火柴拼数字的游戏,比如1要用两个火柴,2要用5根火柴,8要用7根火柴等等(如题目......
  • P10145 [WC2024] 线段树 题解
    P10145[WC2024]线段树题解\(\mathcalO(4^{n})\)做法对于线段树上的一个节点区间\([l,r)\)我们连无向边\((l,r)\),那么可以用加减表示出一个区间\([L,R)\)等价于\(L,R\)两点联通。于是可以枚举每条边选或不选,用可撤销并查集判断两点是否联通,复杂度\(\mathcalO(2^{2......