指针与数组

指针与数组

1.指针与数组的关系

指针和数组是密切相关的。当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。如:

char str[20], *ptr;
ptr=str;//指向数组元素的指针

ptr被置为数组str的第一个元素的地址,因为数组名就是该数组的首地址,也是数组第一个元素的地址。此时可以认为指针ptr就是数组str(反之不成立),这样原来对数组的处理都可以用指针来实现。如对数组元素的访问,既可以用下标变量访问,也可以用指针访问。

实际上,C语言中数组名就是数组的首地址,所以第一个元素的地址可以用两种方法获得:p=&a[0]或p=a。值得注意的是:pa是一个可以变化的指针变量,而a是一个常数。因为数组一经被说明,数组的地址也就是固定的,因此a是不能变化的,不允许使用a++、++a或语句a+=10,而pa++、++pa、pa+=10则是正确的。由此可见,此时指针与数组融为一体。

事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组。

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};//这里var是一个数组,数组本质上是一个指针,指向数组的第一个元素的地址,
 
   for (int i = 0; i < MAX; i++)
   {
      *var = i;    // 对var进行取值,并且因为var是一个指针,相当于赋予这个地址的值为i
   }
   *(var + 2) = 500;//将var[2]的值赋值为500

   //var++;//这样写就是错误的,因为var是一个指向数组开头的常量,不能改变其值
   for (int j = 0; j < MAX; j++)
   {
    cout<<var[j]<<endl;     
   }
   
   return 0;
}

输出

2  //可以看出,var为数组中的第一个元素的地址,这里只能改变第一个元素的值,其他的位置的值无改变
100
500
请按任意键继续. . .



指针数组

  可能有一种情况,我们想要数组存储指向int或char或其他数据类型的指针。下面是一个指向整数的指针数组的声明。

int *ptr[5]

此处,把ptr声明为一个数组,由5个元素,每个元素都是一个指向int值的指针,

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};
   int *ptr[MAX];
 
   for (int i = 0; i < MAX; i++)
   {
      ptr[i] = &var[i]; // 赋值为整数的地址
   }
   for (int i = 0; i < MAX; i++)
   {
      cout << "Value of var[" << i << "] = ";
      cout << ptr[i] << endl;
	  cout <<"这个位置原来存储的值为" <<*ptr[i] << endl;
	  *ptr[i]+=1;
	   cout <<"这个位置+1被改变后的值为" <<*ptr[i] << endl;
   }
   cout <<"通过指针的作用,成功将数组的每个元素的值做了改变"<<endl ;
   for (int i = 0; i < MAX; i++)
   {
      cout << var[i]<<endl;
   }
   return 0;
}

运行结果

Value of var[0] = 008FFD04
这个位置原来存储的值为10
这个位置+1被改变后的值为11
Value of var[1] = 008FFD08
这个位置原来存储的值为100
这个位置+1被改变后的值为101
Value of var[2] = 008FFD0C
这个位置原来存储的值为200
这个位置+1被改变后的值为201
通过指针的作用,成功将数组的每个元素的值做了改变
11
101
201
请按任意键继续. . .

指针与数组的区别:

1.把数组作为参数传递的时候,会退化为指针

数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

所以,数组名作为函数形参时,其沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。

#include<iostream>
using namespace std;
void func(int a[])
{
	cout<<a[1]<<endl;
	 a[1]=9;
	 cout<<a[1]<<endl;
}

int main()

{
	int b[10]={1,2,3}; 
	cout<<b[1]<<endl;
    func(b);
	cout<<b[1]<<endl;

}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值