1、地址与指针
地址:就是内存区中对每个字节的编号
指针:可以看作是内存中的一个地址。在程序中定义了一个变量,在进行编译时就会给该变量在内存中分配一个地址,通过访问这个地址可以找到相应的变量,这个
变量的地址称为该变量的“指针”。
如果一个变量专门来存放另一个变量的地址,它就是指针变量。在c语言中专门用来存放内存单元地址的变量类型即指针类型。
2、指针变量:
(1)指针变量的一般形式:
类型说明*变量名 ;其中“*”表示该变量是一个指针变量,变量名即为定义的指针变量名,类型说明便是本指针变量所指向的变量的数据类型。
(2)指针变量的赋值:给指针变量的赋值只能赋予地址。
一般形式为:
&变量名;
两种方法:
1)定义指针变量的同时就进行赋值,例如:int a; int *p=&a;
2)先定义指针变量之后再赋值,例如:int a; int *p; p=&a;
如果先定义完指针变量之后再赋值注意不要加“*”;
(3)指针变量的引用:引用指针变量是对变量进行简介访问的一种形式。
对指针变量的引用形式如:
*指针变量;其含义是引用指针变量所指向的值。
(4)"&"和"*"运算符
运算符“&”一个返回操作数地址的单目运算符,叫做取地址运算符;
运算符“*”是单目运算符,叫做指针运算符,作用是返回指定地址内的变量的值。
(5)“&*”和“*&”的区别
“&”和“*”的运算符优先级别相同,按
自右向左的方向结合。
例如:int a;
p=&a;
"&*p"就是先进行“*”运算,即“*p”相当于变量a;再进行“&”运算,就是说,“&*p”是取a的地址。同理“*&a”就是取变量a所在地址的值,就是变量a;
(6)指针自加自减运算:不同于普通变量的自增自减运算,这里的自增自减是地址的自增自减,加减的值和指针变量的类型有关。
3、一维数组与指针
当定义一个一位数组时,系统会在内存中为该数组分配一个存储空间,其数组名称就是数组在内存中的首地址,若再定义一个指针变量,并将数组的首地址传给指针变量,则该指针就指向了这个一维数组。
4、二维数组与指针
表示二维数组中元素地址的方法:
(1)&a[0][0]既可以看作数组0行0列的首地址,也可以看做二维数组的首地址。&a[m][n]就是第m行n列元素的地址。
(2)a[0]+n表示第0行第n个元素的地址
5、字符串与指针:
访问一个字符串有两种方式,一是使用字符数组来存放一个字符串,从而实现对字符串的操作;二是使用字符指针指向一个字符串,此时可不定义数组。
6、字符串数组
字符数组是一个一维数组,而字符串数组是以字符串作为数组元素的数组,可以将其看成一个二维字符数组。
例如:
char country[5][20]=
{
"China",
"Japan",
"Russia",
"Germany",
"Switzerland"
}
字符型数组变量country被定义为含有5个字符串的数组,每个字符串的长度要小于20(这里要考虑字符串最后的\0)。但这样浪费空间。但是用指针数组就好,不会浪费空间。
指针数组:一个数组,其元素均为指针类型数据,称为指针数组。也就是说,指针数组中的每一个元素都相当于一个指针变量。
例如:
int i;
char *month[]=
{
"January",
"February"
};
7、指向指针的指针
指向指针的指针变量定义如下:
类型标识符 **指针变量名;例如:int **p;
其含义为定义一个指针变量p,它指向另一个指针变量,该指针变量又指向另一个基本整型变量。由于指针变量运算符*是自右自左结合,相当于:int *(*p);
8、C语言中实参变量和形参变量之间的数据传递是单向的“只传送”方式。指针变量做函数参数也是如此,调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。
9、参数字符串的长度是不定的,并且参数字符串的长度不需要统一,且参数的数目也是任意的,并不规定具体个数。