【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;
} 

 

双指针 就是一个指针是地址 另一个指针的写的是那个指针的位置

posted @ 2022-07-27 23:07  Tityaaaa  阅读(42)  评论(0编辑  收藏  举报