C语言进阶学习——指针和数组的使用

本文详细介绍了C语言中的指针概念及其应用,包括指针的基本操作、指针与数组的关系、指针用于函数参数的传递以及动态内存分配等内容,并对比了栈和堆的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组

  1. 在定义初始化字符数组时,一定要让字符数组的大小比看到的字符串的长度多1
  2. scanf读入s%可以不取地址,同时遇到空格时便会停止写入

gets和puts

当一次读取一行时便使用gets

下面是常用的几个函数的使用方法。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>

int main() {
	char d[20], c[20] = "wangdao";
	printf("%d\n", strlen(c));
	strcpy(d, c);
	puts(d);
	int ret = strcmp("how", "hello");
	printf("%d\n", ret);
	return 0;
}

指针学习

取地址操作符为&

取值操作符为*,注意指针变量名是没有 * 的

&,*优先级是相同的,同时对一个变量使用会相互抵消

对于定义,指针初始化一定是某个变量取地址。

#include <stdio.h>
int main() {
	int i = 5;
	int* p = &i;
	printf("i=%d\n", i); //直接访问
	printf("*p=%d", *p); //间接访问
    return 0;
}

指针的传递

作用:在C语言中,想要子函数里面修改主函数的值,便需要使用指针

函数调用的本质是值传递

数组传递是弱化为指针的,例如在函数中声明a[],和声明*a,本质上上是一样的

#include <stdio.h>

void change(int *j) {//j为实参
	*j = 5;
}

int main() {
	int i = 10;
	printf("before change :%d\n", i);
	change(&i);//i为实参
	printf("after change:%d\n", i);
	return 0;
}

指针的偏移

数组的设计是特殊的,不能和整形变量等其他变量作比较

数组名 a 类型是数组,a里面存了一个值,是地址值,是数组的起始地址

#include <stdio.h>

int main() {
	int a[5] = { 1,2,3,4,5 };
	int* p;
	p = a;
	printf("*p=%d\n", *p);
	for (int i = 0; i < 5; i++) {
		printf("%d\n", *(p + i));
	}
	return 0;
}

写代码时要知道自己使用的哪一块内存,而非注重变量的,要养成这样的习惯。

#include<stdio.h>

//这一部分不是特别重要
int main() {
	int a[3] = { 2,7,8 };
	int* p;
	int j;
	p = a;//让指针p指向数组a的头部
	j = *p++;//无论什么时候遇到++,都是先把++忽略不看,第二步再去看++
	printf("a[0]=%d,j=%d,*p=%d\n", a[0], j, *p);
	j = p[0]++;
	printf("a[0]=%d,j=%d,*p=%d\n", a[0], j, *p);
	return 0;
}
//a[0]=2,j=2,*p=7
//a[0]=2,j=7,*p=8

指针与一维数组

#include<stdio.h>

void change(char* d) {
	*d = 'H';
	d[1] = 'E';
	*(d + 2) = 'L';
}

int main() {
	char c[10] = "hello";
	change(c);
	puts(c);
	return 0;
} 

指针与动态内存申请

数组一开始定义好就确定下来了,数组是放在栈空间里面的,而栈空间在编译开始时就确定好了

如果使用的弓箭大小不确定就要使用堆空间

进程地址空间会自动分为栈空间与堆空间,栈空间效率比较高,使用确定的空间大小时使用这个,但堆空间就好比一个图书馆,你用了之后需要吧空间释放,也就是还回来

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main() {
	int i;//申请多大的空间
	char* p;
	scanf("%d", &i);
	p = (char*)malloc(i);//malloc申请的单位是字节
	strcpy(p, "malloc success");
	puts(p);
	free(p);//释放空间
	printf("free success!\n");
	//system(pause);
	return 0;
}

栈和堆的比较

下面的例子打印不出来是因为在函数里面调用后就会释放栈空间。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char *print_stack() {
	char c[] = "I am print_stack";
	puts(c);
	return c;
}

char* print_malloc() {
	char* p = (char*)malloc(30);
	strcpy(p, "I am print_stack");
	puts(p); 
	return p;
}

int main() {
	char* p;
	char* a;
	p = print_stack();
	a = print_malloc();
	puts(a);//可以正常打印出来
	puts(p);//打印不出来
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值