学习笔记-C语言6(指针与动态内存分配)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010420283/article/details/83450698

1. 指针

指针的引入:

指针是C语言最强大的功能之一,使用指针可以保存某个变量在内存中的地址,并且通过操作指针来对该片内存进行灵活的操作,例如改变原变量的值,或者构造复杂的数据结构。指针一般初始化为NULL(0)。& 是取地址运算,* 是间接运算符,通过 * 可以访问修改指针所指的变量值。

声明指针变量:变量类型 * 变量名;获取指针指向的变量中存储的值: * 变量名

指向指针的指针:

存储指针的地址的指针是指向指针的指针,使用 * 指针指向普通变量,使用 ** 指针指向 * 指针,使用 *** 指针指向 ** 指针,...

一维数组与指针:

数组是相同类型的对象集合,通过数组名称可以索引数组的各个元素;数组的名称实际上是数组的地址,即数组第一个元素a[0]的地址。同样我们可以通过指针来遍历、访问、修改数组中的元素值。指针向前移动时,移动的单位长度即为该指针大小。

示例代码:

#include <stdio.h>
int main(){
	int number[5] = {10, 20, 30, 40, 50};
	int *pointer = number;
	int i;
	printf("number = %p pointer = %p\n", number, pointer);
	printf("sizeof(number) = %d sizeof(pointer) = %d\n",
						sizeof(number), sizeof(pointer));
	printf("\n");
	for (i = 0; i < 5; i++){
		printf("number[%d]'s address = %p\n", i, &number[i]);
		printf("pointer = %p pointer's value = %d\n", pointer, *pointer);
		pointer++;
	}
	printf("\n");	
	pointer = number;
	for (i = 0; i < 5; i++){
		printf("number[%d] = %d, %d\n", i, *(pointer + i), pointer[i]);
	}	
	return 0;
}

变量是一个元素的数组:

C语言中一切内容都与内存地址有关,一个元素的变量与数组没有本质的区别,都是使用内存存储数据,我们可以将单独的变量看做是包含一个元素的数组。数组下标运算符[]与取消运算符 * ,本质上实现的是相同的功能。

示例代码:

#include <stdio.h>

int main(){	
	int number = 0;
	int *pointer = &number;
	
	*pointer = 30;
	printf("number = %d\n", number);
	
	pointer[0] = 999;
	printf("number = %d\n", number);
	
	*&number = 100;
	printf("number = %d\n", number);
	
	(&number)[0] = 25;	//数组下标运算优先级更高
	printf("number = %d\n", number);
	
	return 0;
}

字符串与指针:

利用指针访问字符串或者修改字符串中的数据,就是使用指针访问或者修改一维字符数组中的数据。字符串只是逻辑上的概念,要注意的是字符串以字符串结束符 '\0' 标记结束。通常情况下,操作字符串时使用指针形式要比使用数组形式更常见,两者没有本质区别。

示例代码:

#include <stdio.h>

void my_strcpy1(char to[], const char from[]){
	int i = 0;
	while(from[i]){
		to[i] = from[i];
		i++;
	}
	to[i] = '\0';
}

void my_strcpy2(char *to, const char *from){
	while(*from){
		*to = *from;
		to++;
		from++;
	}
	*to = '\0';
}

int main(){
	char str[10] = "123456789";
	char str2_1[20] = "123456789123456789";
	char str2_2[20] = "123456789123456789";
	my_strcpy1(str2_1, str);
	my_strcpy2(str2_2, str);
	printf("str2_1 = [%s]\n", str2_1);
	printf("str2_2 = [%s]\n", str2_2);
	return 0;
}

指针的基础用法练习:

定义两个证书,number1和number2,两个指针pointer1和pointer2,使pointer1指向number1,pointer2指向number2;一个指向指针的指针p_pointer,指向pointer2。实现如下代码:

1)通过pointer1与p_pointer读入数据,存储至number1与number2;

2)通过pointer1与p_pointer将number1与number2修改为999与100;

3)通过p_pointer将pointer2的指向修改为指向number1。

实现代码:

猜你喜欢

转载自blog.csdn.net/u010420283/article/details/83450698