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