指针和指针变量的概念
- 内存地址──内存中存储单元的编号
(1)计算机硬件系统的内存储器中,拥有大量的存储单元(容量为1字节)。 为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个惟一的地址。 - 变量地址──系统分配给变量的内存单元的起始地址
注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。 - 指针与指针变量
(1)指针──即地址 一个变量的地址称为该变量的指针。 (2)指针变量──专门用于存储其它变量地址的变量 指针与指针变量的区别,就是变量值与变量的区别。 - 指针变量的定义
如:
int i , j
int *pointer-1 , *pointer-2;
pointer-1=&i;
pointer-2=&j;
定义格式:类型 *指针变量名 说明:(1)用*表示定义的变量为指针变量 (2)指针变量的类型为指针变量指向的地址单元内值的类型。
- 指针变量的引用
main()
{int a=3,*p;
p=&a;
printf(“a=%d,*P=%d”,a,*p);
printf(“a=%x,*p=%x”,&a,p);
}
在非定义语句中出现的*p表示指针变量P所存放的地址中的内容
指针与一维数组
- 概念
数组的指针──数组在内存中的起始地址; 数组元素的指针──数组元素在内存中的起始 地址。 - 指向数组的指针变量的定义
与指向普通变量的指针变量的定义方法一样。 例如:
int array[10], *pointer;
pointer=array (或&array[0]);
注意:数组名代表数组在内存中的起始地址(与第1个元素的地址相同),所以可以用数组名给指针变量赋值。 3. 通过指针引用数组元素 如果有 “int array[10],pointer=array;则: (1)pointer+i和array+i都是数组元素array[i]的地址。 (2)(pointer+i)和*(array+i)就是数组元素array[i]。 例如,假设指针变量pointer的当前值为3000,则pointer+1为3000+1*4=3004,而不是3001。 pointer+1指向下一个数组元素地址
指针与二维数组
字符串的指针和指向字符串的指针变量
动态分配内存
- 在<stdlib.h> 中定义了下面的函数
malloc( size); 向系统申请大小为size的内存块,把首地址返回。如果申请不成功,返回NULLfree(* p); 释放由malloc() 申请的内存块。p是指向此块的指针
#include <stdlib.h>
main()
{int *p ;
p = (int *) malloc(4);
scanf("%d",p);
printf("%d",*p);
free(p);
}
一般在写程序需要判断分配内存是否成功,使用如下程序语句: if(p!=NULL) ……………………//需要执行的语句 else ……………//打印分配内存不成功出错信息
#include <stdlib.h>
main()
{int *p ;
p = (int *) malloc(4);
If(p!=null)
{scanf("%d",p);
printf("%d",*p);
free(p);}
else
printf(“没有申请到空间”);
}
|