指针运算、二级指针、指针函数、函数指针

本文深入探讨了C语言中指针的基本概念与操作方法,包括指针的定义、运算及与数组的关系。通过实例演示了如何使用指针进行变量间的交换、数组元素的访问以及指针作为函数参数的应用。
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>

//指针的定义,指针的运算
int main(){
	int a = 10;
	int *p;
	p = &a;
	*p = *p + 10;
	printf("p:%d,a:%d\n", *p, a);//20 20
	int y = 1 + *p;
	printf("y:%d\n", y);//21
	*p += 1;
	printf("p:%d,a:%d\n", *p, a);//21 21
	(*p)++;//先去指针p指向的值,再将该值自增1
	printf("P:%d,a:%d,p address:%#x\n", *p, a, p);//22,22
	*p++;//先取指针p指向的值,再将指针p自增1;
	printf("P:%d,a:%d,p address:%#x\n", *p, a, p);
	*(p++);//先将指针p自增1,再取指针p指向的值
	printf("P:%d,a:%d,p address:%#x\n", *p, a, p);
	system("pause");
	return 0;
}

//数组与指针
int main(){
	//数组名,就是数组的首地址
	int a[5] = { 1, 2, 3, 4, 5 };
	int * p;
	p = a;//p赋值a数组的首地址

	int i;
	printf("%#x\n", a);
	// a+5 ,表示a 移动到数组的第5个位置
	for (i = 0; p < a + 5; p++){
		*p = i;
		i++;
	}
	//a数组值 {0,1,2,3,4}

	p = p + 1;
	p++;
	printf("p:%d\n", *p);
	return 0;
}

//指针变量名
//指针变量都是用于存地址的,而地址都是用4个字节的数字表示的。所以,指针变量都是占用4个字节
int main(){
	int a = 10;
	int *p = &a;
	printf("p address:%#x\n",p);//0x22f738
	p++;
	printf("p address:%#x\n", p);//0x22f73c

	//p是一个指针变量名
	//*p 是从p指针变量里面取出一个int 型数据

	char *cp = "hello dongnao";
	printf("cp address: %#x\n", cp);//0x11e5860
	cp++;
	printf("cp address: %#x\n", cp);//0x11e5861
	printf("sizeof p = %d, sizof cp = %d", sizeof(p), sizeof(cp));//4 4
	system("pause");
	return 0;
}

//指针和函数参数
void swap(int d, int e){
	printf("d address: %#x, e address: %#x \n", &d, &e);
	int temp;
	temp = d;
	d = e;
	e = temp;
}

// 形参的修改不能带来这个实产的修改
// 将a b 的地址copy 给了 形参,然后,将这个份copy 的地址进行了切换,而地址所指的值是没有变的
void swap2(int *a, int *b) {
	printf("swap2 a address: %#x, b address: %#x \n", a, b);// 0x36f72c 0x36f720
	int *temp;
	temp = a; // a address 给了temp
	a = b;    // a 的地址变成了b的地址
	b = temp;  //b 的地址变成了a 的地址
	printf("swap2 a address: %#x, b address: %#x \n", a, b);// 0x36f720 0x36f72c
}

void swap3(int *a, int *b) {
	int temp;
	temp = *a;
	*a = *b;  // *a  代表是a所指的地址上面的值
	*b = temp; // 将 b 所在地址的值变成了temp
}


int main(){
	int a, b;
	a = 10;
	b = 5;
	printf("a address:%#x,b address:%#x \n", &a, &b);//a address:0x50fb98,b address:0x50fb8c
	swap(a, b);//0x36f648 0x36f64c
	printf("a = %d, b = %d\n", a, b);//10 5
	swap2(&a, &b);// 0x36f72c 0x36f720   0x36f720 0x36f72c
	printf("a = %d, b = %d\n", a, b);//10 5
	swap3(&a, &b);
	printf("a = %d, b = %d\n", a, b);//5 10
	system("pause");
	return 0;
}

//指针数组,数组指针
void sort(char *name[], int n);//如果函数放在mian后面必须先声明
int main(){
	char *name[] = { "hello", "dongNao", "Alvin", "world" };
	int i, n = 4;
	sort(name, n);
	for (i = 0; i < n; i++){
		printf("%s\n", name[i]);
	}
	//Alvin dongNao hello world
	//数组指针
	// p2 指向的是?指向的是一个数组,一个有5个元素的数组
	char(*p2)[5];
	//p2 是一个指针变量名

	system("pause");
	return 0;
}

//参数,是char 类型的指针数组
//name[i]是一个指针

void sort(char * name[], int n){
	char *temp;
	int i, j;
	for (i = 0; i < n; i++){
		for (j = 0; j < n - 1 - i; j++){
			if (strcmp(name[j], name[j + 1])>0){
				temp = name[j];
				name[j] = name[j + 1];
				name[j + 1] = temp;
			}
		}
	}
}

//二级指针
// 二级指针,存的内容是一个一级指针的地址
// p 的值就是 p 这个变量,这个变量保存的是p 的地址
// *p 运算,得到的就是a 的值
// *p2 运算,得到的就是p的值
//**p2 运算,得到的就是 p的值的 *运算得到的值 a;
int main(){
	int a = 100;
	int *p;
	p = &a;

	int  **p2;
	p2 = &p;

	return 0;
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值