C语言指针学习

C语言指针学习

#个人考研学习笔记

使用场景:传递与偏移

指针的定义:内存区域中的每个字节都对应一个编号,这个编号就是“地址“。指针变量是一种特殊的变量,它用来存放变量地址

指针变量格式如下:

基本类型 *指针变量名;

int *pointer;

说明:描述某个变量的地址的时候都是说他的起始地址 。

1、指针与指针变量是两个概念

一个变量的地址称为该变量的”指针“。

如果有一个变量专门用来存放另一变量的地址(即指针),那么称之为”指针变量“

编写32位程序,寻址范围4字节,sizeof(i_pointer) = 4;

2、取址操作符与取值操作符

取址操作为&,也称为引用

取值操作为,也称为解引用*

3、传递与偏移

3.1、传递
#include <stadio.h>
void change(int *j){
    *j = 5;
}
int main(){
    int i = 10;
    printf("改变前i=%d\n",i); //i=10
    change(&i);
    printf("改变后i=%d\n",i); //i=5
    return 0;
}
3.2、 偏移

对指针进行加减得到其他变量地址

#include <stdio.h>
#define N 5
int main(){
    int a[N] = {1,2,3,4,5};//数组名内存储了数组得起始地址,因此a中存储的就是一个地址值
    int *p;//定义指针变量p
    p = a;//*p = 1,只拿前4个字节的地址
    int i;
    for(i =0;i<N; i++){
        printf("%3d",*(p+i));
    }
    return 0;
}

4、指针与动态内存申请(malloc)

定义数组长度固定不方便,因为数组变量在栈空间中,而栈空间的大小在编译时是确定的。如果使用的空间大小不确定,那就要使用堆空间。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
	int size; //申请空间的大小
	char *p; //void*类型指针不能偏移,因此不会定义无类型指针
	scanf("%d", &size); //输入要申请空间的大小

	//malloc返回void*是无类型指针
	p=(char*)malloc(size); //申请堆空间
	strcpy(p, "hello");
	//p[0] = 'h';
	//p[1] = 'e';
	//p[2] = 'l';
	//p[3] = 'l';
	//p[4] = 'o';
	puts(p);
	free(p);//释放空间
	
	return 0;
}

需要注意指针本身大小和其指向的空间大小是两码事,不能和前面的变量类比

栈的效率远高于堆,但不能动态分配空间

5、栈与堆的差异

#include <stdio.h>
#include < stdlib.h>
#include <string.h>
//堆和栈的差异

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

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

int main() {

	char* p;
	p = print_stack(); //栈空间被释放因此乱码
	puts(p);

	p = print_malloc();
	puts(p);
	free(p);
	return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qSZI8zwJ-1686643064589)(D:\24考研\img\image-20230607093950893.png)]

6、作业

题目一:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Ysfq41w-1686643064590)(D:\24考研\img\image-20230607102647289.png)]

#include <stdio.h>

int change(int *i) {
	*i = *i / 2;
	return *i;
}
int main() {
	int data;
	scanf_s("%d", &data);
	printf("data = %d", change(&data));
	return 0;
}

题目二:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C7xwDaPj-1686643064591)(D:\24考研\img\image-20230607102704854.png)]

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

int main() {
	int size;
	scanf_s("%d", &size);
	char *str;
	str = (char*)malloc(size);
	char c;
	scanf_s("%c", &c);//去除换行
	gets_s(str, size);
	puts(str);
	free(str);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值