在C语言中,指针与数组之间存在着密切的联系。本博客重点介绍指向一维数组的指针、指向二维数组的指针以及指向字符串的指针及其在程序中的应用。
目录
一、指向一维数组的指针
1.一维数组的地址
在定义数组时,系统会自动分配一段连续的存储空间,数组名就是这块连续存储空间的首地址,也就是数组第一个(下标为0)元素的地址,是一个地址常量。
例如 char a[5]数组的地址示意图:
注意: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.通过指针变量引用一维数组
说明: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<m;i++)
{
sum=0;
for(j=0;j<3;j++)
{
sum=sum+*(*(b+i)+j);
*(*(b+i)+3)=sum;
}
}
}
三、指向字符串的指针
1.字符串的表示
(1)在定义字符指针变量时用字符串常量对其初始化 一般格式如下
char *指针变量名=字符串常量;
(2)定义字符指针变量后,再将字符串常量赋给字符指针常量,格式如下
char *指针变量名;
指针变量名=字符串常量;
//例如
char *ps;
ps="program";
(3)在定义字符指针变量后,将存放字符串的字符数组首地址赋给字符指针变量:
char 数组名[ ]=字符串常量;
char *指针变量名;
指针变量名=数组名;
//例如
char s[]="program";
char*ps;
ps=s;
2.字符串的引用
(1)逐个字符引用
#include<stdio.h>
int main()
{
char*ps="program";
for(;*ps!='\0';ps++)
printf("%c",*ps++);
return 0;
}
(2)整体引用
#include<stdio.h>
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.地址常量和地址变量不同。
本期博客到这里就结束啦~~指针内容持续更新中,喜欢的话点赞收藏加关注吧!!