指针和函数的关系
- 作用:通过指针间接访问某个内存
-
定义一个函数考虑什么情况下参数是指针,这个函数会不会改变传递过来的数据本身 ,需要改变外部的值 就将这个变量定义为指针变量
#include <stdio.h>
void test(int *pa, int *pb){
(*pa)++;
(*pb)++;
}
int main(){
int a = 10;
int b = 20;
test(&a,&b);
printf("a:%d\n",a);
printf("b:%d",b);
return 0;
}
输出结果:
a:11
b:21
数组、函数、指针(输入一个num数组,输出时使每个元素都加一)
- 函数接收数组时,必须知道数组元素个数。函数里面是通过指针变量来接收数组的地址,指针变量无法确定指向的内容的大小
- 访问数组有两种方式
- num[3]
- *(num+3)
#include <stdio.h>
//void test(int p[], int count){
void test2(int *p, int count){
for (int i = 0; i < count; i++){
p[i]++; //p[i] += 1;
//*((p + i))++; //*(p + i) += 1;
//*((p+i)++); 错在哪里 不能对表达式++ --
}
}
int main(){
int a = 10;
a++; a = a + 1;
2++; 2 = 2 + 1;
int b = 20;
test(&a, &b);
printf("a:%d b:%d\n", a, b);
int num[5] = {1,2,3,4,5};
test2(num,5);
for(int i = 0; i < 5; i++){
printf("%d ", num[i]);
}
return 0;
}
内存的分配
- 常量字符串的内存空间有系统自动分配,在常量区里面分配,当程序结束才会被释放 。
- 常量区 - 常量 const int a = 1;
- 静态区 static
- 栈 局部变量 int a = 10;离开作用域就自动收回
- 堆 自己申请的内存 malloc calloc realloc必须自己释放
常量字符串
#include <stdio.h>
char* test(){
char *name = "jack";//常量字符串
return name;
}
int main(){
char *p ;
p = test();
printf("-%s\n", p);
return 0;
}
输出结果:jack
上边程序中jack是一个常量字符串,所以最终显示出来的是jack(当程序最终才被释放)
申请的栈
#include <stdio.h>
char *test(){
char name[10] = {'j','a','c','k'};
return name;
}
int main(){
char *p ;
p = test();
printf("-%s\n", p);
return 0;
}
此时输出结果为乱码,不会输出jack
上边程序是由于jack被释放,成为了野指针
静态变量
#include <stdio.h>
void test(){
//静态变量只会被定义一次,生命周期是整个程序
static int count = 0;
count++;
printf("count:%d\n",count);
}
int main(){
test();
test();
return 0;
}
输出结果:
count:1
count:2