指针与一维数组:
#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;
}
指针与自增自减运算符:
#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;
}
指针与动态内存申请:
#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;
}
出现上图异常的原因:进行释放空间(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;
}
请大佬们多多指正,谢谢!!!