C语言学习09——指针与数组

1.指针类型统一占用4字节或8字节

2.指针注意事项

(1)type *类型的指针只保存Type类型变量的地址

(2)禁止不同类型的指针相互赋值

(3)禁止将普通数值当作地址赋值给指针

(4)指针保存的地址必须是有效地址

3.通过指针可以实现函数返回多个值

例如可以通过函数返回两个数相加和相乘的结果,但是普通变量却只能返回一个

指针函数:

复制代码
void calculate_sum_product(int a, int b, int *sum_ptr, int *product_ptr) {
    // 直接修改指针指向的内存(外部变量)
    *sum_ptr = a + b;       // 把和存入sum_ptr指向的地址
    *product_ptr = a * b;   // 把积存入product_ptr指向的地址
}

普通函数:

复制代码
int calculate_only_sum(int a, int b) {
    return a + b;
}

4.指针和数组的关系

(1)数组名可以看作是一个指针,代表数组中0元素的地址

int a\[\]={1,2,3,4,5};

则a<=>&a0

(2)当指针指向数组元素时,可进行指针运算

int *p= a; //p指向0号元素

p=p+1; //p指向1号元素

5.深入理解数组地址

int a\[\]={1,2,3,4,5}

&a和a虽然数值上相同,但是意义不同

&a表述数组地址,类型是int (*) 5,指针类型是指向数组int 5

a代表0号元素的地址,类型是int*

例:int (*pName) 5=&a 定义了一个名为pName的指针变量,指向 "包含 5 个 int 类型元素的数组" 的指针,然后把数组a的地址赋值给了这个指针

复制代码
int main(){
	
	int a[]={1,2,3,4,0};
	int (*pa)[5]=&a;
	int *p=a;
	printf("%p,%p\n",pa,p); //打印指针时占位符为%p
	while(*p){
		printf("%d\n",*p); //1 2 3 4
		p++; //移动到下一个元素
	}
	return 0;
	
}

扩展:a+i即为数组中第i个元素的地址

int *p=a 则ai<->*(a+i)<->*(p+i)<->pi

a是int*类型,i是int类型,所以特殊在于两个类型相加是int*类型

复制代码
int a[]={1,2,3,4,0};
	int *p=a;
	for(int i=0;i<5;i++){
		printf("%d,%d,%d,%d\n",a[i],*(a+i),p[i],*(p+i)); //1111 2222 3333 4444 0000
	}
	printf("a=%p,p=%p\n",a,p); //a和p是相同的
	printf("&a=%p,&p=%p\n",&a,&p); //a和p的地址是不同的
	return 0;	

6.C语言中的字符串类型是char*,所以打印字符串时的占位符可以是%s和%p

char str\[\] = "hello";

printf("字符串内容:%s\n", str); // 输出 hello

str是char*类型的,所以字符串也是char*类型

复制代码
printf("%p\n","hello"); //00405044
printf("%p\n","hello"); //00405044

两次打印的结果相同,因为相同的字符串字面量只会在内存中存储一份

7.int v=*p++即先从p指向的内存中取值,然后p向后移动

即为int v=*p; p++;

复制代码
int a[]={1,2,3};
	int *p=a;
	int v=*p++;
	printf("v=%d,*p=%d\n",v,*p); //1 2

例:

复制代码
int main(){
	char*s=NULL;
	printf("first=%c\n",*"HELLO"); //H
	s="HELLO";
	while(*s){
		//TODO
		printf("%c",*s++); //HELLO
	}
	printf("\n");
	return 0;
}
相关推荐
灯厂码农4 小时前
C语言动态内存分配完全指南(malloc、calloc、realloc、free)
java·c语言·算法
wuyk5554 小时前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机
qq_241585615 小时前
可用在中断中浮点数打印类似printf
c语言
C语言小火车6 小时前
C++ 快速排序(Quick Sort)深度精讲:分治思想、Lomuto 分区法及三数取中优化,面试手撕必会
c语言·开发语言·c++·面试·排序算法·快速排序
aaaameliaaa8 小时前
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
c语言·数据结构·笔记·算法
灯厂码农8 小时前
C语言内存管理——内存对齐与共用体union
linux·服务器·c语言
伏 念10 小时前
AI Coding 零基础实战教程
c语言·进程·预处理
你家人养牛10 小时前
OOC Relation Plugin:C 语言面向对象 开发的高效辅助工具
c语言·vscode
东华万里11 小时前
第30篇 代码习惯 初学C与数据结构有感
c语言·数据结构·大学生专区
想你依然心痛11 小时前
嵌入式C代码规范:MISRA-C 2012核心规则解读——类型安全与未定义行为深度剖析
c语言·安全·代码规范