指针变量
什么叫指针,指针顾名思义就是指向一个东西,这里指针就是指向对应得变量等的内存地址。
就这么说吧,如果我们定义了一个变量int a,这个时候系统就会给a这个变量分配4bit的内存空间。 二这个空间就有对应的名字——内存地址,就如装餐具的空间叫餐柜一样,餐柜就是它的内存地址。
当然如何知道到 a 的内存地址是什么呢?这个时候就要用这个‘&’取地址运算符。这个当然不会陌生,当我们用c语言输入scanf("%d",&a);就会需要。这里也许会有人疑问,为什么当我输入
字符串或数组时不用&。以后将会说到。
指针变量的定义
int *p=NULL; 众所周知一般变量定义后都要给初始值。这里的NULL是一个特殊的地址0,叫做零指针,这是第一种初始化方法。
int a;
int *p = &a;
这是第二种初始化方法,&a是取a的地址赋给指针变量p。
int *p = new(int);
这是地三种初始方法,申请一个空间给p,而*p的值不确定。
这里的p代表的是地址,而’*p’代表p地址中储存的值。
给指针变量赋值
int a = 1;
int *p;
p = &a;
scanf("%d",*p);//结果为1可以去尝试下
补充说明一下’*‘为间接运算符。
以下代码是对指针的运用:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a,b,s,t,*pa,*pb;
pa = &a;
pb = &b;
a = 10;b = 20;
s = *pa + *pb;
printf("a=%,b=%d\n",*pa,*pb);
printf("s=%d,t=%d\n",s,t);
return 0;
}
上机实践就可以简单的明白,指针的用法了;
指针与数组和字符串
上面提出的可能会有人对为什么用scanf()函数输入不用取地址符呢?
对与数组的声明
int a[1000];
这是一个简单的数组声明,而这个a代表的就是数组的第一个内存地址。我们可以把数组想像成一条绳子,被分成1000段。而a则是这条绳子的第一段。当然我们在知道每段的长度和它第一段的位置
我们也就课以推出它第n段到第一段之间有多少段绳子。
于是数组的赋值我们又可以这样写:
int a[1000]
for(int i=0;i<1000;i++)
{
scanf("%d",a+i);//编译器不会报错
}
这里的a+i;不是我们平常所理解的加法这是在加上i个int型大小。
就这么说吧——a+1,因为a是为首地址所以他下一个地址就是a+1;相当与a[1];
而字符串也是一样的。
指针与结构体。
struct node
{
int x;
}*P;
//或node *p;
它同样与上面相同否要初始化;
而这里我就说一点,调用结构体中的变量名的方法。
p->成员名等价与(*p).成员名:
下面给出一个结构体指针运用的举例:
#include<iostream>
using namespace std;
struct student
{
char name[20];
char sex;
int score;
}s[3]={{"dasd",'f',356},//结构体数组的赋值
{"sa",'m',234},
{"sadas",'f',985}
};
int main()
{
student*p;
printf("NAME SEX SCORE\n");
for(p=s;p<s+3;p++)//p++与上面讲的数组a+1,一样。
printf("%-9s%3c%7d\n",p->name,p->sex,p->score);
return 0;
}
指针在动态数据结构上有相当多的用处,应多加学习。
若有错请大老们留言指教。