2

[C语言]指针(补充高级)(momentous)

 2 years ago
source link: https://blog.51cto.com/u_15388211/5502003
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

[C语言]指针(补充高级)(momentous)

原创

mb61611d44c3903 2022-07-21 20:49:10 博主文章分类:C基础 ©著作权

文章标签 指针高级 C语言基础 考研准备 文章分类 C/C++ 编程语言 阅读数136

指针与一维数组:

#include <stdio.h>


//函数调用的本质是值传递
//数组名作为实参传递给子函数时,是弱化为指针的
// (整型数组传递时弱化为整型指针,浮点型数组弱化
// 为浮点型指针,字符型数组弱化为字符型指针)
//因此进行传递时直接写成char *d,
//而不用写成char d[]

void change(char *d)
{
printf("%c\n", *(d+4));//进行指针偏移
*d = 'H';
d[1] = 'E';
*(d + 2) = 'L';
}

int main()
{
char c[10] = "hello";
change(c);
puts(c);
return 0;
}
[C语言]指针(补充高级)(momentous)_指针高级

指针与自增自减运算符:

#include <stdio.h>


int main()
{
int a[3] = { 2,7,9 };
int* p;
p = a;//让指针变量p指向数组的开头
int j;
j = *p++;//j=*p;p++,任何时候都是把后加加去掉,第二步看另外一个运算符优先级是否高于++
printf("a[0]=%d,j=%d,*p=%d\n", a[0], j, *p);
//j = (*p)++;//j=*p;(*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;
}
[C语言]指针(补充高级)(momentous)_C语言基础_02

指针与动态内存申请:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
/*
C语言中的整型、浮点型、字符型变量、数组变量都在栈空间中,
而栈空间的大小在编译时是确定的。如果使用的空间大小不确定,
那么就要使用堆空间
*/

//malloc可以帮助我们实现动态数组
int main()
{
int i;//代表申请多大的空间
scanf("%d", &i);
char* p;
p = (char*)malloc(i);//malloc申请空间的单位是字节
strcpy(p, "malloc success");
puts(p);
//p++;//指针偏移
puts(p);
free(p);//释放空间,p的值必须和最初的malloc返回的值一致
p = NULL;//如果不把p值赋值为NULL的话,这时称p为野指针
return 0;
}
[C语言]指针(补充高级)(momentous)_指针高级_03
[C语言]指针(补充高级)(momentous)_考研准备_04

出现上图异常的原因:进行释放空间(free)时,把指针发生了偏移,这是不可的

栈空间与堆空间的差异:

#include <stdio.h>
//栈
char* print_stack()
{
char c[17] = "I am print_stack";
puts(c);//打印正常
return c;
}
//堆
char* print_malloc()
{
char* p = (char*)malloc(30);
strcpy(p,"I am print_malloc");
puts(p);//打印正常
return p;
}

int main()
{
char* p;
p = print_stack();//栈空间会随着函数的执行结束而释放
//puts(p);//打印异常,不能让指针变量指向一个栈空间里面的数据去访问

p = print_malloc();//堆空间不会随着子函数的结束而释放,必须自己free
puts(p); //打印正常
return 0;

}
[C语言]指针(补充高级)(momentous)_指针高级_05

请大佬们多多指正,谢谢!!!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK