C语言指针

指针就是内存地址,一个变量所在的内存地址就是该变量的指针。

&:取变量内存地址,即取指针。

*:取内存地址对应的变量,即取指针所指的变量。


定义指针变量:类型* 指针变量名;

例如:

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








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值