当一次读取一行时便使用gets
下面是常用的几个函数的使用方法。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
int main() {
char d[20], c[20] = "wangdao";
printf("%d\n", strlen(c));
strcpy(d, c);
puts(d);
int ret = strcmp("how", "hello");
printf("%d\n", ret);
return 0;
}
取地址操作符为&
取值操作符为*,注意指针变量名是没有 * 的
&,*优先级是相同的,同时对一个变量使用会相互抵消
对于定义,指针初始化一定是某个变量取地址。
#include
int main() {
int i = 5;
int* p = &i;
printf("i=%d\n", i); //直接访问
printf("*p=%d", *p); //间接访问
return 0;
}
作用:在C语言中,想要子函数里面修改主函数的值,便需要使用指针
函数调用的本质是值传递
数组传递是弱化为指针的,例如在函数中声明a[],和声明*a,本质上上是一样的
#include
void change(int *j) {//j为实参
*j = 5;
}
int main() {
int i = 10;
printf("before change :%d\n", i);
change(&i);//i为实参
printf("after change:%d\n", i);
return 0;
}
数组的设计是特殊的,不能和整形变量等其他变量作比较
数组名 a 类型是数组,a里面存了一个值,是地址值,是数组的起始地址
#include
int main() {
int a[5] = { 1,2,3,4,5 };
int* p;
p = a;
printf("*p=%d\n", *p);
for (int i = 0; i < 5; i++) {
printf("%d\n", *(p + i));
}
return 0;
}
写代码时要知道自己使用的哪一块内存,而非注重变量的,要养成这样的习惯。
#include
//这一部分不是特别重要
int main() {
int a[3] = { 2,7,8 };
int* p;
int j;
p = a;//让指针p指向数组a的头部
j = *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;
}
//a[0]=2,j=2,*p=7
//a[0]=2,j=7,*p=8
#include
void change(char* d) {
*d = 'H';
d[1] = 'E';
*(d + 2) = 'L';
}
int main() {
char c[10] = "hello";
change(c);
puts(c);
return 0;
}
数组一开始定义好就确定下来了,数组是放在栈空间里面的,而栈空间在编译开始时就确定好了
如果使用的弓箭大小不确定就要使用堆空间
进程地址空间会自动分为栈空间与堆空间,栈空间效率比较高,使用确定的空间大小时使用这个,但堆空间就好比一个图书馆,你用了之后需要吧空间释放,也就是还回来
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
int main() {
int i;//申请多大的空间
char* p;
scanf("%d", &i);
p = (char*)malloc(i);//malloc申请的单位是字节
strcpy(p, "malloc success");
puts(p);
free(p);//释放空间
printf("free success!\n");
//system(pause);
return 0;
}
下面的例子打印不出来是因为在函数里面调用后就会释放栈空间。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
char *print_stack() {
char c[] = "I am print_stack";
puts(c);
return c;
}
char* print_malloc() {
char* p = (char*)malloc(30);
strcpy(p, "I am print_stack");
puts(p);
return p;
}
int main() {
char* p;
char* a;
p = print_stack();
a = print_malloc();
puts(a);//可以正常打印出来
puts(p);//打印不出来
return 0;
}