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

文章目录

    • 数组
    • gets和puts
    • 指针学习
      • 指针的传递
      • 指针的偏移
      • 指针与一维数组
      • 指针与动态内存申请
      • 栈和堆的比较

数组

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

gets和puts

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

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

#define _CRT_SECURE_NO_WARNINGS
#include 
#include

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 
int main() {
	int i = 5;
	int* p = &i;
	printf("i=%d\n", i); //直接访问
	printf("*p=%d", *p); //间接访问
    return 0;
}

指针的传递

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

函数调用的本质是值传递

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

#include 

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 

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

//这一部分不是特别重要
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

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
#include
#include

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
#include
#include

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;
}

你可能感兴趣的:(C语言进阶学习,c语言,学习)