• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

C学习-基础:指针与一维数组、二维数组

数组名

一个数组的元素在内存中是连续存放的,数组第一个元素地址数组的首地址。C语言中,数组名该数组的首地址

例如有以下定义语句: 

int a[10],*p;

则语句 p=a; p=&a[0];等价的,都表示指针变量p指向a数组首地

数组首地址的值是一个地址常量,是不能改变的。因此,语句 a=p; 或a++;都是非法的。但是p是地址变量,可以进行++等操作

指针与一维数组

1. 通过一维数组名存取数组元素

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int waitag;

    char str[10] = {"Chinese"};
    printf("改变前原数组为:%s\n第三个元素变为:%c\n", str, *(str + 3));
    *(str + 3) = 'q';   // str+3 与 str[3] 等价
    printf("改变第三个元素:%s\n第三个元素变为:%c\n", str, *(str + 3));
    
    scanf("%d", &waitag);
    return 0;
}

结果为

改变前原数组为:Chinese
第三个元素变为:n
改变第三个元素:Chiqese
第三个元素变为:q

假设有一维数组a,可知a+i是元素a[i]的地址,根据指针运算符“*”的运算规则可知 *(a+i) 与元素 a[i]等价。

2. 通过指针运算符“*”存取数组元素

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int waitag;
    char str[10] = {"Chinese"},*p;
    p=str;
    printf("改变前原数组为:%s\n第三个元素变为:%c\n", str, *(str + 3));
    *(p + 3) = 'q';  // 通过 指针运算符 存取数组元素
    printf("改变第三个元素:%s\n第三个元素变为:%c\n", str, *(str + 3));
    scanf("%d", &waitag);
    return 0;
}

结果为

改变前原数组为:Chinese
第三个元素变为:n
改变第三个元素:Chiqese
第三个元素变为:q

假设有一维数组a,即p指向a数组的首地址,可知p+i是元素a[i]的地址,根据指针运算符“*”的运算规则知 *(p+i) 与元素 a[i]等价。

3、通过带下标的指针变量存取数组元素

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int waitag;
    char str[10] = {"Chinese"},*p;
    p=str;
    printf("改变前原数组为:%s\n第三个元素变为:%c\n", str, *(str + 3));
    p[3] = 'q';   //通过 带下标的 指针变量
    printf("改变第三个元素:%s\n第三个元素变为:%c\n", str, *(str + 3));
    scanf("%d", &waitag);
    return 0;
}

结果为

改变前原数组为:Chinese
第三个元素变为:n
改变第三个元素:Chiqese
第三个元素变为:q

C语言中的下标运算符“[ ]”可以构成表达式,假设p为指针变量,i为整型表达式,则可以把p[i]看成是表达式首先按p+i计算地址,然后再存取此地址单元中的值。因此p[i]*(p+i)等价。

指针与二维数组

二维数组由一维数组扩展形成,可以理解为特殊的一维数组。即一维数组每一个元素作为数组名形成一行数组,各行数组元素个数相同,元素个数二维数组的列数

(1) 指向数组元素的指针变量是一级指针变量:将二维数组当成一维数组访问。

(2) 指向一维数组的指针变量是 行指针变量

(2) 指向指针的指针变量二级指针变量

无标题.jpg

一维数组行指针变量

类型  (*指针变量名)[一维数组元素个数];

int  a[3][4], (*prt)[4]; prt=a;

考虑其中的(*prt)[4],因为( )和[ ]的优先级相同,*prt表示prt应为指针变量,它指向一个含有4个元素的一维整型数组,而不是指向一个元素,因此它是二级指针变量(行指针变量),可以移动。

 int (*prt)[4]:表示它指向一个含有4个元素的一维整型数组;用于二维数组

 int *prt[4]:表示它是一个包含4个指向整型类型的指针变量的指针数组;用于一维数组

例子:

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int waitag;
    
    printf("指针引用一维数组 *p[2]\n");
    char t, b[2] = {'a', 'b'}, *p[2]; //*p[2]表示含有两个指向整型类型的指针变量的指针数组,like {*x,*y}
    for (t = 0; t < 2; t++)
    {
        p[t] = &b[t];
        printf("%c\n", *p[t]);
    }
    
    printf("\n指针引用二维数组 (*prt)[2]\n");
    int i, j;
    int a[3][2] = {1, 2, 3, 4, 5, 6}, (*prt)[2]; //(*prt)[2]表示指向一个含有2个元素的一维整型数组
    prt = a;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 2; j++)
        {
            printf("%d\n", prt[i][j]);
        }
    }
    
    scanf("%d", &waitag);
    return 0;
}

输出:

指针引用一维数组 *p[2]
a
b

指针引用二维数组 (*prt)[2]
1
2
3
4
5
6






0
0
下一篇:C学习-基础:字符串的指针变量

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。