C语言指针

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值