一、指针与指针变量
(1)
Int *p=&a;//p是地址(指针,有点像中断程序的入口地址,可以通过&p得到),*p是值(指针变量)?
如图解释:(设定为32位系统,4字节一个指针)
指针是指向指针变量的地址,指针变量是指向变量的地址。(有点像间接寻址)
指针都是存放4个或8个字节,与类型无关,与系统的寻址能力有关。(譬如以前是16为地址,指针即为2个字节,现在一般是32位系统,所以是4个字节,以后64位,则就为8个字节)
(2)例子
char *pa=&a;// 获取变量a的地址存在指针变量pa中 。&是取地址符号。
printf("a=%c\n",*pa); // *是取值运算符
printf("the addr of a is :%p\n",pa);//注意打印地址的字符是p,p是打印地址类型的数据
(c是打印单个字符,s是打印字符串)
(3)要避免访问未初始化的指针,超级危险
最好定义的时候就初始化
int mian(){
int *a;//自定义,没有初始化
*a=123;
return 0;}//像未初始化的变量一样会随机分配,但是指针随机分配的地址,可能会分配到系统程序区的地址,(编译器可能会报错),还有会分配到不是你像要的地址。
二、指针和数组
(1)回顾上节:p已经是地址的,在用scanf输入的时候不需要取地址符号,输入字符串流中也不需要加入取值符号,字符串本身就是字符数组,且数组名是首元素地址。
(2)如何用一个指针指向数组?
将数组的首地址存入指针变量中:
Int a[128];
Int *p=a; or int *p=&a[0];
指针运算就可以访问其他
(3)也可以直接通过指针法来访问数组,无需定义,只要在数组名前加上*
char p[]="FishC";
printf("*p=%c ,*(p+1)=%c\n",*p,*(p+1));
(4)
float d[]={1,2,23,1,5};
float *f=d;
printf("*p=%d ,*(p+1)=%d\n",*f,*(f+1));//p+1是指将数组元素加一访问,而不是单纯加一
printf("第一个数的地址:%p\n",f);
printf("第二个数的地址:%p\n",f+1);
(5)用指针定义字符串,用数组下标访问字符串
char *str="I love fish";
int i,len;
len=strlen(str);//可以提高效率 ,减少函数调用次数
for(i=0;i<len;i++){
printf("%c",str[i]);
}