数组与指针

一维数组的指针

如:int a[10],*p=a;
a为数组名,数组名代表数组的首地址,即&a[0]

指针类型的算术和关系运算

指针的算术运算

如:int a [10]={10,20,30},*p=a,i;
cout<<*p;   结果:10
p++;
cout<<*p;  结果:20
p指向int型,因int型变量为4字节长度,所以,p+1相当于p+4,同样p+i相当于p+i*4

两个同类型指针作减法运算

指针2-指针1==>整数(常用于计算两个指针之间包含元素的个数)
#include<iostream>
using namespace std;
int main()
{
	int a[10]={10,20,30},*p1=a,*p2=a+2,i;
	cout<<p2-p1<<endl;
 } 
 结果为2

指针的关系运算
即两个指针可以比较大小
例:使用指针输出数组各元素的值

 double x[5]={1,2,3,4,5,6,7},*p;
 for(p=x;p<x+7;p++)
 cout<<*p<<endl;

数组元素的不同表示形式

 int a[10],*ptr=a,i;
a[i]=*(a+i)=*(ptr+i)=ptr[i]
a[i]为数组元素的下标法
*(a+i)为数组元素的指针法

二维数组的指针

例:寻找a数组中元素的最大值

二维数组:int a[3][4],i,j;
  int *p,max=a[0][0];
  for(p=&a[0][0];p<&a[0][0]+12;p++)
     if(*p>max)
     max=*p;
     cout<<max;
     注:&a[0][0]+12,是从00,01,02,03,10,11,12,13,20,以此类推

二维数组的指针法表示
如:a[3][4]

 a代表&a[0],即0行的地址
 a+1代表&a[1],即1行的地址
 a+2代表&a[2],即2行的地址
 a[i]+j代表&a[i][j]
 *(a[i]+j)等价于a[i][j]
* (* (a+i)+j)为二维数组元素a[i][j]的指针法表示
  a为首行地址,a+i为i行的行地址,而*(a+i)为a的i行0列元素的地址,而*(a+i)+j为a的i行j列元素的地址    
注:当p表示&a[0][0]时
 int a[3][4],*p=&a[0][0]
   a[i][j]=*(p+i*4+j)

指向具有M个元素的一维数组指针

类型 (*指针变量)[M] (M表示二维数组的列数)

例:利用行指针变量,按行输出二维数组各元素的值
int a[3][4]={{1,3,5,7},{2,4,6,8},{1,2,3,4}},(*p)[4];                   //直接声明(*p)[4]
for(p=a;p<a+3;p++)
{
for(int j=0;j<4;j++)
cout<<*(*p+j);
*p是一个行地址,*p+j代表该行j列元素的地址**

字符串指针

char *str=“hello”;
    str[2]   指的是字符l
    *(str+1)指的是字符e  

与二维数组不同

在字符串中查找某字符的函数

结果为b=5

#include<iostream>
using namespace std;
char *str(char *c,char b)           //返回值为指针的函数,调用函数定义变量也得是指针 
{
	while(*c!='\0')               //字符串结尾为'\0',不能写' '
	{
		if(*c==b)
		return c;
		c++;
	}
	return NULL;               //NULL必须全是大写 
}
int main()
{
	
char *y="qwervbn",*p;     //char *y,*p;不能是char *y,p; 

p=str(y,'b');            //因为返回的是地址,所以p和str都是指针型 ,查找的b为字符,所以为  ‘b’
cout<<p-y<<endl;           //p是b在字符串中的地址,y是首地址。
return 0;
}

指针数组

定义5个int型的指针数组

int *p[5]

定义指向多个字符串的指针数组

 char *str[]={"basic","fortran","c++","java"};

结构体与指针

 结构体类型      *指针变量名

访问结构变量中的成员

格式1: (*指针变量).成员名
格式2:   指针变量->成员名(->为结构指向运算符)

例子:

 struct Date
 {
  int   year;
  int  month;
  int  day;
  };
  int main
  {
  Date  d={2015,4,8},*p=d;
  cout<<(*p).year;
  cout<<p->year;
  return 0;
  }

对于结构体数组

   struct button top[10],*p=top;
   cin>>p->name;                              ->前为地址
   cin>>p[0].name;                            .前为确定的元素*p等同于*(p+a)和p[a]

动态数组

new运算符—用于动态申请所需的内存空间
指针变量=new 类型
动态申请单个变量:

动态申请一个double型变量,初值为100.0
double *p;
p=new double;
*p=100.0
或 p=new double(100.0)

动态申请数组
指针变量=new 类型[元素个数]
动态申请80个字符的数组

char *str;
str=new char[80]

动态创建n个元素的一维整形数组

#include<iostream>
using namespace std;
int main()
{
	int n,*p;
	cout<<"请输入n值: "; 
	cin>>n;
	p=new int[n];
	if(p=NULL)
	{cout<<"没有足够的内存空间";
	return 1;}
	cout<<"请输入n个数:";
	for(int i=0;i<n;i++)
	cin>>p[i];	 
 } 

delete运算符:释放动态申请到的存储空间
动态释放单个变量:

delete 指针变量;

动态释放数组:

delete[ ]指针变量;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值