【ccc】为了ds的ccc2
作业:
#include <stdio.h> #include<string.h> int main(){ char s[100]; gets(s); int len; len = strlen(s); for(int i=0;i<len-1;i++){ printf("%c\n",s[i]); } puts(s); }
//
hello
h
e
l
l
hello
指针:
值传递
#include <stdio.h> #include<string.h> void change(int j){ j=5;//形参 } int main(){ int i =10; //i是局部变量 printf("befor change i=%d\n",i); change(i);//函数调用时,i是实参 printf("after change i=%d\n",i); return 0; }
指针:
#include <stdio.h> #include<string.h> void change(int *j){ *j=5;//形参 } int main(){ int i =10; //i是局部变量 printf("befor change i=%d\n",i); // change(i);//函数调用时,i是实参 // printf("after change i=%d\n",i); change(&i); //函数调用时,&i是实参 printf("afterer i=%d",i); return 0; }
如果是需要到改变函数值的时候,可以使用指针来对值进行修改,取到地址值,再将地址值对应的形参赋值给实参达到改变的目的;
指针的偏移:
场景: 数组不能和整型变量,浮点型,字符型变量类比
数组名 a 类型是数组,a里面存了一个值,是地址值,是数组的起始地址。
#include <stdio.h>
#include<string.h>
int main(){
int a[5]={1,2,3,4,5};
int *p;//对一个指针变量进行取值,得到的类型是其基类型
p=a;
printf("*p=%d",*p);
}
内存权限(3):可读,可写,可读写
常见错误:
对应内存位置不可读
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)); //p+i的优先级 比*低 } return 0; }
*p=1
1
2
3
4
5
指针自增 自减
#include <stdio.h> #include<string.h> //指针自增自减 int main(){ int a[3]={2,7,8}; int *p; int j;//j的地址 指针 p=a;//让指针变量p,指向数组的开头 j=*p++;//先把*p的值赋值给j,然后对p+1 //j=*p;如果不是(*p)++ 那么就是先p++ // j=(*p)++;//给这里加了括号是指的是这个地址对应的数值+1 也就是a[0]=2,变成a[0]=3; printf("a[0]=%d,j=%d,*p=%d\n",a[0],j,*p); //2,2,7 j=p[0]++;//j=p[0];p[0]++; printf("a[0]=%d,j=%d,*p=%d\n",a[0],j,*p);//2,2,7 的基础上再执行 结果:2,7,8 system("pause"); return 0; }
//一维数组 数组传递是弱化为指针的 char d[] =*d void change(char *d){ *d ='H'; *d = 'E'; } int main(){ char c[10]="hello"; change(c); puts(c); return 0; }
void change(char *d){ *d ='H'; d[1] = 'E'; d[2]='L'; //传递与偏移 } int main(){ char c[10]="hello"; change(c); puts(c); return 0; }
//指针与动态内存申请 列表 二叉树 图——动态对应的堆空间;
//整型、浮点型、字符型变量、数组放在栈空间
栈的效率高 直接定义了空间
动态申请(很重要
malloc -- free -- NULL
int main(){ int i; char *p;//起始地址 scanf("%d",&i); p=(char*)malloc(i);//申请空间的接口 单位是字节 很重要 strcpy(p,"malloc success"); puts(p); free(p);//释放空间时,p得值必须和最初得申请一致 printf("free success\n"); p=NULL; //如果不把p值设置为NULL p就被称为野指针 system("pause"); }
栈空间与堆空间区别
子函数里写一个栈空间的东西;
主函数里如果函数执行时结束子函数的内容时,就会将子函数执行结束栈空间释放掉;
puts();打印不出子函数里的栈里的内容了;
如果是堆函数(声明时,最好要强转,类型一致比较好)
在子函数里打印puts正常,在主函数里打印puts都正常
子函数中申请的堆空间,如果不free就会一直在,即使子函数结束,也不会影响堆空间;
指针
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ int i; scanf("%d",&i); char *p; p = (char*)malloc(i); char c; scanf("%c",&c); gets(p); puts(p); return 0; }
双指针 就是一个指针是地址 另一个指针的写的是那个指针的位置