指针与数组
首先,需弄清楚指针的具体含义。
计算机的内存以字节为单位。一般一个字节(8个二进制位)称为一个内存单元。声明变量后,系统会根据要求给这个变量分配相应的内存空间。如:
int a;int b;
int型数据,被分配4个字节的存储单元。
数据存储空间首字节的地址就是数据的地址。
我们把变量的地址称为变量的指针。
我们把存放地址(而不是普通数据)的变量称为指针变量。
即,指针就是变量的地址,是指存储单元的编号。
指针变量的初始化
由于指针变量是用来存放地址的,因此不能把普通数值赋给指针变量,而应该将变量的地址赋给指针变量。
例:
int a=5;
int *p;//定义一个指针变量
p=&a;//把变量a的地址赋给指针变量p,称作p指向a
如果p=5,系统会报错。
而且,int型的指针变量,只能指向同一数据类型的变量。
指针变量的使用
定义指针变量p后,p里面保存的是a的地址,此时,需要“*”()即指针运算符(或间接访问运算符)来找到a的值。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int *p;
int a=5;
p=&a;
cout<<p;
return 0;
}
此时系统输出的不是a的值,而是p所储存的地址
#include<bits/stdc++.h>
using namespace std;
int main()
{
int *p;
int a=5;
p=&a;
cout<<*p;
return 0;
}
这时输出为0
注意:避免使用未初始化的指针,会导致运行错误。
一维数组的指针表示
数组名表示数组首元素的地址。(数组名可认为是一个固定不变的常量指针)
指针不仅可以指向变量,同样可以指向数组。
例:
int a[10];
int *p;
p=&a[0];
p=a等价于p=&a[0]
数组a[i]的地址可以表示为&a[i],或a+i,那么*(a+i)就可表示这个地址所指的对象,即a[i]。
例:输入n个整数,倒序输出
#include<stdio.h>
int main()
{
int n;
int a[500],*p=a,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(p=a+n-1;p>=a;p--)
{
printf("%d ",*p);
}
return 0;
}
或
#include<stdio.h>
int main()
{
int n;
int a[500],*p=a,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
printf("%d ",*(a+i));
}
return 0;
}