指针笔记

本文深入解析了指针的概念,包括初始化、类型、值和地址,并通过代码示例展示了如何使用指针来修改变量值、传递地址以及在函数中应用指针。同时,文章还解释了指针与数组的关系,以及指针在不同场景下的具体应用。

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

指针是什么?

看一下下面的代码和结果,大概清楚指针的一些内容

  #include <stdio.h>
    
    int main(void)
    {
        int a = 1;
        int *p = &a;
    
        printf("整型变量a的值是%d\n", a);
        printf("指针变量p的值是%x\n", p);
        printf("整型变量a的地址是%x\n", &a);
        printf("指针变量p的地址是%x\n", &p);
    
        return 0;
    }

结果为下值
在这里插入图片描述

所以从结果可得:

1). 变量的初始化

指针变量p与整型变量a都需要首先被声明,然后赋予一个初值。代码中,整型变量a的初值是1,指针变量p的初值是变量a的地址。

2). 变量的类型

在定义指针变量p和整型变量a时,都需要指出它们的类型。

整型变量a的类型是int,指针变量p的类型也是int。

整型变量a的int是指变量a不是字符型,不是浮点型,而是一个整型;

指针变量p的int不是说变量p是一个整型变量,而是说p指向的值,本代码中是变量a,是一个整型。

在变量的类型概念方面,指针变量与基本数据变量有差异。

3). 变量的值

本代码中,整型变量a在定义时给予一个初值是1,1就是变量a的值;

指针变量p在定义时也被给予一个初值,这个初值是变量a的地址,变量a的地址就是变量p的值。从运行结果上一眼就能看出来。

4). 变量的地址

整型变量a有自己的地址,指针变量p也有自己的地址。

从本代码运行的结果来看,整型变量a的地址是0x12ff44,指针变量p的地址是0x12ff40。

*p就是通过p所对应的地址指向地址的值
p就是代表一个地址

指针是用于存放另一个变量的内存地址的变量,用&取地址,用*取值。

  1. 指针赋值一定要用取地址符&,不能直接赋值内存地址。

int ex = 8; int * ptr_ex = &ex; 等价于

int ex = 8; int * ptr_ex; ptr_ex = &ex;

  1. 使用指针修改变量值。
  • ptr_ex = 888;
  1. 存放指针的地址。

int ** ptr_ex2 = &ptr_ex;

  1. 使用指针表示一维数组a第i个元素。【int * ptr_a = a】

地址&a[i]: a + i / ptr_a + i

值a[i]/ptr_a[i]: * (a + i)/ * (ptr_a + i)

  1. 使用指针表示二维数组aa第i行第j列元素。【int (* ptr_aa)[列数] = aa】

------先行后列------

值aa[i][j]/ptr_aa[i][j]: *(aa[i] + j) / *(ptr_aa[i] + j) / ((aa + i) + j) / ((ptr_aa + i) + j)

  1. %p:指针占位符(内存地址大写),%x:十六进制占位符(内存地址小写),

  2. 两者本质无差别,都是打印出内存地址。两者本质无差别,都是打印出内存地址。

  3. 值的引用传递。

在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
如下:

int p 
p = *p1;
*p1 = *p2;
*p2 = *p; 

*p + 1和 *(p+1)的区别

int a[]={2,4,6,8};
int *p = (int *)&a;
*p + 1 = 3
*(p + 1) = 4

因为的优先级比+的优先级高,所以P+1在编译器中是先取出p指向的int值然后加1,就是a[0]+1,也就是2+1,所以p+1取出的值等于2。(P+1),因为多了一个括号,所以就变成指针P+1后,再取出里面的值,也就是a[1]的中的值,所以*(P+1)取出的值等于4。

指针与函数的应用

  #include <stdio.h>
int table[10];
void lookup(int *t,int *a,int n)
{ int k;
 *a=t[0];
for(k=1;k<n;k++)
 if(*a > t[k] )
	*a=t[k];
}
void main()
{ int k,min,*p=&min;
for (k=0;k<10;k++)
scanf("%d",table+k);
lookup(table ,p ,10);
printf("min=%d\n",min);
}

通过改变*p指向的值来得到该数组中的最小值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值