指针就是内存地址,一个变量所在的内存地址就是该变量的指针。
&:取变量内存地址,即取指针。
*:取内存地址对应的变量,即取指针所指的变量。
定义指针变量:类型* 指针变量名;
例如:
int* a 定义指向int类型的指针变量,只能存放int类型变量的地址
float* b 定义指向float类型的指针变量,只能存放float类型变量的地址
//指针基础
void zhizhentest1(){
//定义int类型的a变量,值为5
int a = 5;
//定义指向int类型的指针变量p
int* p;
//将a 的地址赋给指针变量p
p = &a;
//*p 输出p所指的变量的值
printf("%d\n", *p);
printf("%d\n", a == *(&a));
}
指针变量作为函数参数:
交换a、b的值
#include <stdio.h>
void swap_(int*,int*);
//指针变量作为函数参数
void zhizhentest2(){
int a=5;
int b=9;
int* pa = &a;
int* pb = &b;
swap_(pa, pb);
printf("pa=%p, pb=%p\n", pa,pb);
printf("a=%d, b=%d\n", a,b);
}
void swap_(int* p1, int* p2){
//将p1所指变量(a)的值赋给tmp,相当于 int tmp = a;
int tmp = *p1;
//将p2所指变量(b)的值赋给p1所指变量(a),相当于 a = b;
*p1 = *p2;
//将tmp变量的值赋给p2所指变量(b),相当与 b = tmp;
*p2 = tmp;
}
输出:
pa=0012FF28, pb=0012FF24
a=9, b=5
数组作为函数参数:
//定义形参arr,arr也是一个指针变量,接收调用函数时传入的指针
void arraytest2_2_1(int arr[]){
//由于arr接收的只是指针,并不是真实数组,所以sizeof其实是对指针进行取占用字节操作,
//32位系统返回4,64位返回8
int len = sizeof(arr)/sizeof(arr[0]);
printf("len=%d\n", len);
for(int i=0; i<len; i++){
printf("arr[%d]=%d\n", i, arr[i]);
}
printf("\n\n");
}
int arr[] = {10,20,-25,4,6};
//传入函数的不是数组本身,而是数组的首地址(第一个元素的地址),即传入的是指针
arraytest2_2_1(arr);
输出:
len=1
arr[0]=10
数组变量arr存放的只是数组的指针(数组首地址),调用arraytest2_2_1传入的只是arr的副本,也是一个指针。
所以arraytest2_2_1形参arr接收的只是一个指针(内存地址)而已,而不是真实的数组名。
然后通过sizeof(arr),其实是对指针进行操作,在32位系统上指针占4字节,64位系统上占8字节,这里是xp系统,所以这里返回的4
而sizeof(arr[0]),其实是对数组的第一个元素类型取占用字节数,arr[0]是int类型,占4字节,所以sizeof(arr[0])返回4,最后len等于1
在定义数组时就计算出数组的长度:
int arr[] = {10,20,-25,4,6};
int len = sizeof(arr)/sizeof(arr[0]);
arraytest2_2_2(arr, len);
//定义函数。参数:int型数组arr用于接收传入的数组指针,len接收传入的数组长度
void arraytest2_2_2(int arr[], int len){
for(int i=0; i<len;i++){
printf("arr[%d]=%d\n", i,arr[i]);
}
printf("\n\n");
}
输出:
arr[0]=10
arr[1]=20
arr[2]=-25
arr[3]=4
arr[4]=6
这里定义int arr[]数组来接受传递过来的指针是可以的,因为arr存放的只是一个指向空数组的指针
通过指针变量来接受传入函数的数组是可以的:
//参数:指向int型的指针变量,len数组长度
void arraytest2_2_3(int* a, int len){
//a保存的是指向数组首地址的指针,a就相当于数组变量,可通过下标访问数组元素
for(int i=0; i< len; i++){
printf("a[%d]=%d\n", i, a[i]);
}
printf("\n\n");
}
输出:
a[0]=10
a[1]=20
a[2]=-25
a[3]=4
a[4]=6