指针初学(C语言)

本文深入解析指针变量的概念,包括其与普通变量的区别,以及如何在C语言中使用指针进行数据操作。从一维数组到二维数组,详细阐述了指针在不同场景下的应用,同时介绍了指针与数组之间的关联及指针指向二维数组行变量的方法。
摘要由CSDN通过智能技术生成

1、指针变量与普通变量

我的理解就是,普通变量的值,只是供程序员和程序所使用的值,而指针变量的值则不同,它的值存放的是其他变量的地址。

定义指针变量与定义普通变量及其相识,只需在变量名前面加星号(*),指针 = *变量。即:

int *p;

或者:

int a[10];
int *p = &a;

其中星号(*)是一个特殊符号,表明一个变量是指数变量,定义时必须带有星号(*),而赋值时不能带有星号。

指针也可以连续定义,连续定义时必须每个都带星号(*),如:

int *a, *b, *c;

而不能:

int *a, b, c;

这样定义表示定义了一个指针变量a和两个普通变量b和c。

获取指针变量指向的值

指针变量存储了数据的地址,通过指针变量能够获得该地址上的数据,格式为:

*q

他的意义为:*指针 = 指针指定变量的值。

下面举个例子:

#include<stdio.h> 

int main()
{    
    int a = 100;
    int *q = &a;
    printf("%d,%d",a,*q);
    return 0;
} 

运行结果:

100,100

指针除了可以获取内存上的数据,也可以修改内存上的数据,例如:

#include <stdio.h>

int main()
{
    int a = 10, b = 55, c = 111;
    int *p = &a;  
    *p = b;  
    c = *p; 
    printf("%d, %d, %d, %d\n", a, b, c, *p);
    return 0;
}

运行结果:

55, 55, 55, 55

要注意的是,定义指针变量时,用星号()来表明这是个指针变量,使用指针变量时星号()表明指针指向的值。

2、指针变量与一维数组

主要内容为:指针 = &数组名[某数] *指针 = 指针指向变量的值 指针+i = &数组名[某数 + i]

下面举个例子:

#include <stdio.h>

int main()
{
    int *p, *q, a[3] = {5,10,15};
    p = &a[0];
    q = &a[1];
    printf("开始时a[0]=%d,a[1]=%d,a[2]=%d\n",a[0],a[1],a[2]);
    *p = *p*2;
    *(q + 1) = *p*2;
    printf("运算后a[0]=%d,a[1]=%d,a[2]=%d\n",a[0],a[1],a[2]);
    return 0;
}

运行结果:

开始时a[0]=5,a[1]=10,a[2]=15
运算后a[0]=10,a[1]=10,a[2]=20

解释:开始我们定义了一个一维数组a,和两个指针变量p,q。我们使p指向a[0],q指向a[1]。开始时a[0]=5。然后进行运算 * p = * p * 2是让指针p指向的值(即a[0]的值5)进行乘2运算,所以最后a[0]=5 * 2=10。

同理开始时a[0]=10(因为上一步进行了运算),q指向a[1],然后进行运算 * (q + 1) = * p * 2是让指针(q + 1)即指向a[1 + 1]=a[2]的值为 * p * 2= 10 * 2=20。

3、指针变量与二维数组

主要内容为:指针 = &数组名[数a][数b] *指针 = 指针指向变量的值 指针+i = &(数组名[数a][数b]后的第i个元素) 即关联数组后的第i个元素

下面举个例子:

#include <stdio.h>

int main()
{
    int *p, *q, a[2][3] = {{1,2,3},{4,5,6}};
    p = &a[0][0];
    q = &a[1][1];
    printf("开始时a[0][0]=%d,a[1][2]=%d\n",a[0][0],a[1][2]);
    *p = *p*2;
    *(q + 1) = *p*2;
    printf("运算后a[0][0]=%d,a[1][2]=%d\n",a[0][0],a[1][2]);
    return 0;
}

运行结果:

开始时a[0][0]=1,a[1][2]=6
运算后a[0][0]=2,a[1][2]=4

解释:开始我们定义了一个二维数组a,和两个指针变量p,q。我们使p指向a[0][0],q指向a[1][1]。开始时a[0][0]=1。然后进行运算 *p = *p *2是让指针p指向的值(即a[0][0]的值1)进行乘2运算,所以最后a[0]=1 * 2=2。

同理开始时a[1][1]=5,q指向a[1],然后进行运算 * (q + 1) = * p * 2是让指针(q + 1)即指向a[1][1]后的第一个数,即a[1][2]的值为* p* 2= 2 * 2=4。

4、指针变量指向二维数组的行变量

定义: *( p )[列数]

关联: p= 二维数组名+某数n

等同于 * (* (p + i) + j) = 二维数组名[p + i][j]

举个例子:

int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p)[4];
p = a + 1;
a[1][2] = *(*p + 2);
a[2][2] = *(*(p + 1) + 2);

上例创建了一个三行两列的二维数组,我们定义了一个指针p指向二维数组的行变量。开始让他等于a+1的意义就是让他指向第二行,这时*p = 1。

所以我们能得到下面的两组等式a[1][2] = *(*p + 2)与a[2][2] = ((p + 1) + 2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值