一.指针变量
指针变量是一种存放地址的特殊变量。
从变量的角度来讲,指针变量也具有变量的要素。
指针变量的类型,是指针变量所指向的变量的类型,而不是自身的类型。
1.定义指针变量:
类型名*指针变量名
2.引用指针变量:
给指针变量赋值:p = &a,指针变量p的值是a的地址。
引用指针变量所指向的变量,若执行了p = &a,则printf(“%d”,*p);作用为以整数形式输出指针变量p所指向的变量的值,即变量a的值。
引用指针变量的值,printf(“%o”,p);输出a的地址
二.指针变量作为函数参数
如果想通过函数调用得到n个要改变得值,可以这样做
1.在主调函数中设置n个变量,用n个指针函数指向他们。(p = *a)
2.设计一个函数,有n个指针形参,在这个函数中改变n个形参的值。
3.在主调函数中调用这个函数,在调用时将这n个指针变量作为实参,将他们的地址传给该函数的形参。
4.在执行函数的过程中,通过形参指针变量,改变他们所指向的n个变量的值。
5.主调函数中就可以使用这些改变了的值得变量了。
三.通过指针引用数组
1.数组名代表数组中首元素的地址,因此
p = &a【0】;与
p = a;等价
2.在指针指向数组变量时,可以对指针进行以下运算:
p+1;p-1;p++;p--;
p+1指向同一数组的下一个元素
3.p+i与a+i都表示a[i]的地址
*(p+i)与*(a+i)与a[i]三者等价
注意:可用p++但是不能用a++,因为此时a是一个指针常量,其指向的地址不能改变;
下标法表示组a【i】;指针法表示数组*(a+i)或者*(p+i),其中a是数组名,p是指向数组元素的指针变量,其初值p=a;
使用*(p+i)之前必须先使p = a;
四.用数组名做函数参数
当用数组名做函数参数时,在函数调用期间,形参数组从实参数组那里得到起始地址,因此形参数组和实参数组共用一段内存单位,在调用期间如果改变了形参数组的值,也就是改变了实参数组的值。
五.字符串的引用方式
1.用字符数组存放一个字符串,可以通过数组名和下标引用字符串的一个字符,也可以通过数组名和格式声明“%s”输出该字符
#include<stdio.h>
int main(){
char string[]="I love Shiyanlou!";
printf("%s\n",string);
printf("%c\n",string[9]);
return 0;
}
2..用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量
#include<stdio.h>
int main(){
char * string="I love Shiyanlou!";
printf("%s\n",string);
return 0;
}
六.字符指针做函数参数
在被调函数中改变字符串内容,主调函数中可以引用改变后的字符串,在函数调用实现字符串的复制
#include<stdio.h>
int main(){
void copy_string(char *from,char *to);
char *a = "I am a teacher";
char b[] = "You are a programmer";
char *p = b;
printf("string a=%s\nstring b=%s\n",a,b);
printf("copy string a to string b:\n");
copy_string(a,p);
printf("\n string a=%s\n string b=%s\n",a,b);
return 0;
}
void copy_string(char *from,char *to){
for(;*from!='\0';from++,to++)
*to = *from;
*to = '\0';
}
七.使用字符指针变量和字符数组的比较
1.字符数组由若干元素组成,每个元素中放一个字符,
而字符指针变量中存放的是一个地址。
2.赋值方法:
可以对字符指针变量赋值
不能对数组名赋值
3.存贮单元的内容:
可以对字符数组分配若干个存储单元,以存放各元素的值
对字符指针变量只分配一个存储单元