指针是内存地址
指针变量是用来存放内存地址的变量
指针变量的值是地址(即指针)
指针变量可以有空值,即不指向任何变量
p=NULL;
如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数。
若两个指针指向同一个数组的元素,则可以进行比较,指向前面的元素的指针变量“小于”格向后面元素的指针变量。
*:取值操作符
&: 取址操作符
以下代码示例:
(1)
1 2 3 4 5 6 7 8 9
| #include<stdio.h> int main() { int i=2000; int *pointer; pointer=&i; printf("%d\n",*pointer); return 0; }
|

(2)在函数中运用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include<stdio.h> int main() { int a,b; int *pointer_1,*pointer_2; void swap(int *p1,int *p2); scanf("%d %d",&a,&b); pointer_1=&a; pointer_2=&b; if(a<b) { swap(pointer_1,pointer_2); } printf("%d %d\n",a,b); return 0; }
void swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; }
|

*和&的优先级相同,按照自右向左的顺序
例:
1 2 3
| (1)现令pointer=&a; 则&*pointer==&a (2)*&a==a;
|
C语言运算符优先级表

赋值时,指针变量和变量的类型需要一样
指针变量可以赋值给另一个指针变量
示例程序:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include<stdio.h> int main() { int a,b; int *pointer_1,*pointer_2; a=3; b=5; pointer_1=&a; pointer_2=&b; pointer_1=pointer_2; printf("%d %d\n",*pointer_1,*pointer_2); return 0; }
|

数组和指针
当引用一个数组元素时,可以使用:
(1)下标法:如a[i]
(2)指针法,如*(a+i)
由于数组名指向的是数组的第一个元素的地址,故,假设a是数组名,p是指向数组元素的指针变量,其初值p=a,即p=&a[0],上面的指针法中的a也可以写成p.
(3)指针变量
使用指针变量指向数组元素
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include<stdio.h> int main() { int a[10]={1,2,3,4,5,6,7,8,9,0}; int i; int *p; for(p=a;p<(a+10);p++) { printf("%d",*p); } printf("\n"); return 0; }
|

使用数组名作为函数参数:
1 2 3 4 5 6 7 8 9 10
| void f(int arr[],int n)
{ } void main() { int array[10]; …… f(array,10); }
|
补充一下函数里面实参和形参的内容:
形参(形式参数):
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
实参(实际参数):
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。
多维数组和指针


类型说明符 (*指针变量名)[长度]
例如:
表示p是一个指针变量,指向包含4个元素的一维数组。
1 2
| *(p+i)+j 二维数组i行j列的元素的地址 *(*(p+i)+j)i行j列元素的值
|
字符串和指针
1 2 3 4 5 6 7
| #include<stdio.h> int main() { char *string="HelloWorld!"; printf("%s\n",string); return 0; }
|

字符串也可以用下标法和指针法
下标法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include<stdio.h> int main() { char a[]="HelloWorld!"; int i; char b[100]; for(i=0;*(a+i)!='\0';i++) { *(b+i)=*(a+i); } *(b+i)='\0'; for(i=0;b[i]!='\0';i++) { printf("%c",b[i]); } printf("\n"); return 0; }
|

指针法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include<stdio.h> int main() { char a[]="HelloWorld!"; int i; char b[100]; char *p1,*p2; p1=a; p2=b; for( ;*p1!='\0';p1++,p2++) { *p2=*p1; } *p2='\0'; for(i=0;b[i]!='\0';i++) { printf("%c",b[i]); } printf("\n"); return 0; }
|

字符指针变量和字符数组
1.字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),不是将字符串放到字符指针变量中。
2.赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。
1 2
| char str[20]; str = "Hello World!"
|
而对字符指针变量,可以采用下面方法赋值
1 2
| char *a; a = "HelloWorld!";
|
注意赋给a的不是字符,而是字符串第一个元素的地址。
指向函数的指针
可用于在函数中调用别的函数
1 2 3 4 5 6 7 8 9 10
| #include<stdio.h> int main() { int max(int,int); void process(int x,int y,int(*fun)(int,int)); int a,b; scanf("%d %d",&a,&b); process(a,b,max); return 0; }
|
返回指针值的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include<stdio.h> int main() { int score[][2] = {{10,20},{20,40},{30,60}}; int *search(int(*pointer)[2],int n); int *p; int i,m; scanf("%d",&m); p=search(score,m); for(i=0;i<2;i++) { printf("%d\t",*(p+i)); } printf("\n"); return 0; } int *search(int (*pointer)[2],int n) { int *pt; pt=*(pointer+n); return pt; }
|

指针函数和函数指针
指针函数是指带指针的函数,本质是一个函数。
函数指针是指向函数的指针变量,因而函数指针本身首先应是指针变量了,只不过该指针变量指向函数。
指针数组
一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为:
int *name[4];
指向指针的指针
例如:
