红色的为2018/1/3之前还未接触到
首先说指针,指针是一个可以指向变量地址的特殊变量,它本身有地址,但主要是指向别的变量的指针,它所储存的变量地址在32位系统下为4字节,也就是说计算机分配一个内存地址给指针,让它去储存别的变量的地址,还有就是它的类型是它所指向的变量的类型,比如: int i ,它的意思是定义一个指针变量指向整型,类似有浮点型指针,字符型指针,还有指向数组,指向函数,指向指针的指针等,声明指针变量的类型是因为可以知道所需要的储存空间更重要是为了运算和运算规则,下面进行对指针进行声明和定义的解释
定义为 <类型> <*变量名>如int *i;这里对类型进一步说明,类型为这个指针只能指向定义类型的变量如此例中仅能表示指向类型为整型的变量,指针p++为指向下一个地址,为int型则加4个字节以此类推float double等
指针的初始化:
一.可以边定义边赋值如
#include
int main()
{
int a=1;
int *p=&a;//这就是边定义边赋值记住变量a前必须有取地址符&因为指针为指向变量地址的所以必须有取地址符号若是数组则不同因为数组本身为地址看下边代码。
printf("%d\n",*p);
return 0;
}
下边代码为数组的赋值因为数组本身为地址所以
1. #include
2. int main()
3. {
4. int a[]={5,3};
5. int *p=a,*h=a;//赋值时不要直接写成*p=a[0];*h=a[1];这样不对,数组本身为地址是说a这个数组本身为地址所以直接写成*p=a;就可以了这就是说p指向数组a的首地址也可以写成*p=&[0];这样也可以
6. printf("%d %d\n",*(p),*(h+1));//这样的话就必须要用括号了因为*为取地址的内容运算级别高所以必须用括号,P+1就是第二个数,之前理解错了。
7. return 0;
8. }
二.可以先声明后赋值如
#include
intmain()
{
int a=1,b=2;
int *p,*h;
p=&a;
h=&b;
printf("%d %d\n",*p,*h);
return 0;
}
三.用一个指针给另一个指针赋值如
#include
int main()
{
inta=1;
int*p,*h;
p=&a;
h=p;//因为指针p本身为地址所以直接赋给h就可以了不用取地址符&了
printf("%d%d\n",*p,*h);
return0;
}
注意基类型不同的指针变量之间不能用上述第三种相互赋值,还有就是空指针int *p=NULL;为空指针代表不指向任何有效地址,被定义为0,即p=’\0’或p=0好像没啥大用
一些列子:
定义一个数组和指针:int a[5],*p;
则a[0]相当于*p
a[1]相当于*(p+1)
类似a[4]相当于*(p+4)
数组a相当于&a[0],都是数组a的地址
a+i==&a[i]表示第i+1个元素的地址。