C语言指针

本文深入解析C语言指针的概念,包括指针变量定义、使用指针访问变量、指针与数组的关系、指针运算符优先级及实例、指针与字符串的交互,以及指针在函数参数中的应用。通过具体代码示例,帮助读者理解指针的复杂用法。

C语言指针

在上学的时候学C,指针算是学的最懵逼的一节了吧。每次编程碰到指针都是一脸懵逼,完全不知道在干嘛

一、什么是指针变量
指针变量:用来存储地址的变量。有了地址,就可以用来访问变量了。至于c为什么要引入指针,百度说的挺详细的。
二、定义
数据类型 *变量名;
三、如何用指针访问变量
int a,*p;
a = 3;
p = &a;//将p指向a变量【必须加&,指针只能存储地址,不能将其他数据类型放到其中】
p 取值操作,当然有些情况是不用,也是能够取值得。
printf("%d",*p); //3
*p = 100; [指针的存操作,直接改变了a变量的值]
printf("%d",a); //100
例外情况
int a[3] = {1,2,3};
p = a;//这是不用&,因为数组名本身就是一个地址 完全等价于 p = &a[0];
printf("%d",*p);//取到了数组的第一个元素
四、指针与数组千丝万缕的关系
p+1 的含义:即指针往后移动一个地址,移动的字节数是不确定,根据数据类型而定,比如INT 就往后移动4个字节
结论:指针P+1 = 指针P + sizeof(指针的类型) * 1
那么就有 :
p = a === a[0]
p+1 === a[1]
p+2 === a[2]
p+i === a[i]
取值时: *(p+i) 就等价于 a[i]喽;
五、【*p++ *(p++) (*p)++】 的关系
优先级:() 大于 * 大于 +
所以呢:
p++ => 先取出p[这时候已经取到了变量的值了],在对这个结果+1
*(p++) => 因为括号优先级高,先执行(p++):即指针往后移动一个地址,最后在取移动后的变量值
两者因为优先级的问题,导致一开始的操作对象是不一样的。
看个例子,重点

#include<stdio.h>
int main(){
        int a[3]={1,8,3},*p;
        p = &a[0];
        printf("a=%d\n",*(p++)); // 1   () > *  ,所以先执行p++,但p++是先用后加,这时候,p还没指向下个地址,然后执行*p,得到还是数组的首个元素1
        printf("a=%d\n",*p);//8    因为上一个语句的p++,导致p执行下个地址,所以获得数组的第二元素8

        p = a;//指针重新指向数组起始地址
        printf("a=%d\n",*p++);//1      * > +;所以先执行*p,得到1;后执行p++,p指向了数组的第二个元素
        printf("a=%d\n",*p);//8        这时p已经指向第二元素的地址了

        p = a;
        printf("a=%d\n",(*p)++);//1  () > +  先执行*p,得到1,之后1+1 = 2;【注意这时候是值加一,而不是指针移动了】
        printf("a=%d\n",*p);//2 打印就是2了


	  p = a;
	  printf("a=%d\n",++(*p)); // 2   这个情况就是++a 与 a++的区别啦
	  printf("a=%d\n",*p); //2
        return 0;
}

六:指针与字符串

char *x;
        x = "hello world";
        printf("%c\n",*(x+1));//e
        printf("%s",x);//hello world

同样p+1,也是同样移到下一个地址
char *p = “hello”; 与 char p[] = “hello”;的区别
第一个是定义了一个字符型指针,指向了常量区是不能够修改的。
所以例如这样的操作(*p = *q)是错误的!!!

而第二个是普通数组变量,放在栈中,可以修改。

七、指针作为函数参数数组名作为函数参数****

  • 指针作为函数参数【即中所谓的引用】
    好处:能够直接在函数改变变量的值,解决一个函数只能返回单个值的问题。
    例子:角色互换
  • 数组名作为函数参数
  • 指针名是一个变量,而数组名是一个常量。差别就在这里。
    我们也可以将数组名作为函数参数,并且在调用函数中,能够访问,还能够直接改变它的值。
    所以,
    int sum (int a[],int n); int sum(int *a,int n)
    int a[] 等价于 int *a;
    写个例子。
#include<stdio.h>

int main (){

   void sumArray(int a[],int n);
   void sumPointer(int *a,int n);

   int n=5,i;
   int a[5] = {1,2,3,4,5};
   sumArray(a,n);
   for(i=0;i<5;i++){
       printf("%d ",a[i]);
   }
   printf("\n");
   sumPointer(a,n);
   for(i=0;i<5;i++){
       printf("%d ",a[i]);
   }
   return 0;
}
/**
* 数组作为函数参数
*/
void sumArray(int a[],int n){
   int i,j,t;
   j = n -1;
   for(i=0;i<j;i++){
       //jiaohuan
       t = a[i];
       a[i] = a[j];
       a[j] = t;
       j--;
   }
}
/**
* 指针作为函数参数
*/
void sumPointer(int *a,int n){
   int *start,*end,t;
   end = a+n-1;//将指针指向末尾
   for(start=a;start<end;start++){
       t = *start;
       *start = *end;
       *end = t;
       end--;
   };

}

在这里插入图片描述

在linux搭建php环境:https://study.163.com/course/introduction/1209187856.htm

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值