C语言详细笔记--指针(2)指针与数组

在C语言中,指针与数组之间存在着密切的联系。本博客重点介绍指向一维数组的指针、指向二维数组的指针以及指向字符串的指针及其在程序中的应用。


目录

一、指向一维数组的指针

1.一维数组的地址

2.指向一维数组的指针变量

3.指针的算数运算与关系运算

3.1加减整数运算

3.2 两个指针相减

3.3 指针的关系运算

4.通过指针变量引用一维数组

二、指向二维数组的指针

1.二维数组的地址 

2.通过二维数组的行指针引用二维数组元素

3.通过二维数组的列指针引用二维数组元素

4.指向二维数组的指针作为函数参数

三、指向字符串的指针

1.字符串的表示

2.字符串的引用

3.指向字符串的指针作为函数参数

4.指向字符串的指针变量与字符数组的区别


一、指向一维数组的指针

1.一维数组的地址

在定义数组时,系统会自动分配一段连续的存储空间,数组名就是这块连续存储空间的首地址,也就是数组第一个(下标为0)元素的地址,是一个地址常量。

例如 char a[5]数组的地址示意图: 

C语言详细笔记--指针(2)指针与数组_第1张图片

注意:a表示数组首元素地址,*a或*(a+0)表示数组元素a[0],*(a+i)表示数字元素a[i]。

2.指向一维数组的指针变量

先定义一个一维数组,再定义一个指针变量,接着把把某个数组元素地址赋给指针变量,也可以是数组名。 

int a[10];//定义了一个包含10个int型元素的一维数组a
int *pa;//定义指向int型变量的指针变量pa
pa=&a[0];//将a[0]的地址赋给指针变量pa

3.指针的算数运算与关系运算

3.1加减整数运算

指针变量加上或减去某个正整数i,实际上就是从当前所指向的位置 向后(向前)移动i个元素。

int a[10],*pa,*p;
pa=a;
p=pa+3;//等价于a+3其值为&a[3]

3.2 两个指针相减

指针-指针=之间的元素个数 

//例如求字符串长度函数
int my_strlen(char*str)
{
 char*start=str;
char*end=str;
while(*end!='\0')
{
end++
}
return end-start;

3.3 指针的关系运算

指向同一个数组的两个指针可以通过关系运算符< ,<= ,> ,>=, == , !=进行关系运算。 

4.通过指针变量引用一维数组

C语言详细笔记--指针(2)指针与数组_第2张图片

说明:1.pa+i和a+i都是元素a[i]的地址,他们都指向数组元素a[i]

2.*(pa+i)和*(a+i) 就是数组元素。

3.指向一维数组的指针变量也可以带下标,pa[i]与*(pa+i)等价,即数组a[i]。

5.指向一维数组的指针作为函数参数

有两种书写形式:void fun(int arr[ ],int n)

void fun (int *arr,int n)两种等价。

二、指向二维数组的指针

1.二维数组的地址 

int b[3][4];

数组名b看成一个行地址(第0行的地址),b[i] *(b+i)可以表示由b[i][0]、 b[i][1]、b[i][2]、b[i][3]这四个Int型元素构成的一维数组的数组名,代表该一维数组的首地址。

2.通过二维数组的行指针引用二维数组元素

定义指针变量指向包含N个元素的一维数组,这种指向一维数组的指针是存储行地址的指针变量,一般格式如下:

类型说明符(*指针变量名)[整形常量表达式]

说明:指针变量名和*一定要用圆括号括起来;整形常量表达式 表示行指针所指向一维数组的长度,即二维数组的列数。

3.通过二维数组的列指针引用二维数组元素

列指针实际上就是指向二维数组元素的指针

int b[3][4],*pc;
//若要定义二维数组列指针可以用这三种方式初始化
//pc=b[0];
//pc=&b[0][0];
//pc=*b;
//注意不能用pc=b对列指针赋值

4.指向二维数组的指针作为函数参数

//例如函数求m个学生3门课程的总分,并将总分存储在行指针b所指向的一维数组的最后一个元素中
void scoresum(int(*b)[4],int m)
{
    int i,j,sum;
    for(i=0;i

三、指向字符串的指针

1.字符串的表示

(1)在定义字符指针变量时用字符串常量对其初始化 一般格式如下

char *指针变量名=字符串常量;

(2)定义字符指针变量后,再将字符串常量赋给字符指针常量,格式如下

char *指针变量名;

指针变量名=字符串常量; 

//例如
char *ps;
ps="program";

(3)在定义字符指针变量后,将存放字符串的字符数组首地址赋给字符指针变量:

char 数组名[ ]=字符串常量;

char *指针变量名;

指针变量名=数组名; 

//例如
char s[]="program";
char*ps;
ps=s;

2.字符串的引用

(1)逐个字符引用

#include
int main()
{
    char*ps="program";
    for(;*ps!='\0';ps++)
        printf("%c",*ps++);
    return 0;
}

(2)整体引用

#include
int main()
{
    char*ps="program";
    for(;*ps!='\0';ps++)
        printf("%c",ps);
    return 0;
}

3.指向字符串的指针作为函数参数

//字符串复制函数,把指针q所指向的字符串复制到指针p所指向的字符数组中
void strcopy (char*p,char*q)
{
    while(*q!='\0'){
        *p=*q;
        p++;q++;
    }
    *p='\0';//需要给复制后的字符串加上结束符
}

4.指向字符串的指针变量与字符数组的区别

1.存储内容不同,字符指针变量中存储的是字符串的首地址,而字符数组中存储的是字符串本身。

2.分配存储空间不同,字符指针变量占4/8个字节的存储空间没有赋值情况下其值是随机值,字符数组是分配一个连续的存储空间。

3.赋值方式不同,字符数组不能在赋值语句中用字符串常量对其赋值。

char s[100];
s="program";//s是数组首地址,是一个地址常量,不能在程序中被赋值

4.地址常量和地址变量不同。


本期博客到这里就结束啦~~指针内容持续更新中,喜欢的话点赞收藏加关注吧!! 

你可能感兴趣的:(C语言,c语言,笔记,数据结构,c#,算法)