6指针强化

1、指针强化1
1指针是一种数据类型
1 指针变量也是一种变量,占有内存空间,用来保存内存地址
测试指针变量占有内存空间大小。
2 *p 操作内存

int main()
{
    int a=10;
    int *p=NULL;
    //指针指向谁,就把谁的地址赋值给指针
    p=&a;
    //通过*可以找到指针指向的内存区域,操作的是内存
    *p=20;
    printf("p=%d,&a=%d\n",p,&a);
    printf("*p=%d,a=%d\n",*p,a);
    //*在右侧,是取内存的值,是读
    //*在左侧,是给内存的赋值,是写
    int b=*p;
    printf("b=%d\n",b);

    return 0;
}

运行结果:

2、指针变量和它指向的内存块是两个不同的概念

int main()
{
    char *p=NULL;
    char buf[]="abcd";
    printf("p1=%d\n",p);
    //改变指针变量的值,也就是p的值,也就是地址的值
    p=buf;
    printf("p2=%d\n",p);
    //指针变量和指针指向是两个不同的概念
    p=p+1;
    printf("p3=%d\n",p);
    printf("buf=%s\n",buf);
    printf("*p=%c\n",*p);//这里是打印一个字符,用的是%c

    //改变指针指向的内存,并不影响指针的值也就是地址的值
    buf[1]=‘1‘;
    printf("p4=%d\n",p);
    printf("buf1=%s\n",buf);

    //给*p 赋值 *p=‘a‘; 不会改变指针变量的值
    //只会改变所指的内存块的值
    *p=‘z‘;
    printf("p5=%d\n",p);
    printf("buf2=%s\n",buf);
    return 0;
}

运行结果:

3、写内存是要确保内存可写

int main()
{
    //内存常量区,不可修改,修改后报错
    char *buf="abcdf";
    //buf[2]=‘1‘;//error

    //这个是用数组复制到栈区,可以修改数组
    char buf2[]="abcdef";
    buf2[2]=‘3‘;
    printf("%s\n",buf2);

    //指针是一种数据类型,是指它指向的内存空间的数据类型
    //p++是指针的步长,不同的数据类型指针步长不同,根据内存空间的数据类型确定
    int a;
    int *p=&a;
    printf("p=%d\n",p);
    p=p+1;
    printf("p+1=%d\n",p);

    char c;
    char *q=&a;
    printf("q=%d\n",q);
    q=q+1;
    printf("q+1=%d\n",q);

    double d;
    double *k=&a;
    printf("k=%d\n",k);
    k=k+1;
    printf("k+1=%d\n",k);

    //不允许向 NULL 和未知非法地址拷贝内存
    char *p1=NULL;
    //给p1指向的内存区域赋值
    //strcpy(p1,"aaav");//error
    char buf3[100];
    p1=buf3;
    strcpy(p1,"aaav");//ok
    printf("p1=%s\n",p1);

    return 0;
}

运行结果:

4不断的改变指针变量

int main()
{
    char buf[100]="abcdef";
    char *p;
    //不断的给指针变量赋值,就是不断的改变指针变量
    p=&buf[0];//给指针变量赋值
    printf("p1=%d,p1=%c\n",p,*p);
    p=&buf[1];//给指针变量赋值
    printf("p2=%d,p2=%c\n",p,*p);

    char *q=NULL;
    q=(char *)malloc(100);
    if(q==NULL)
    {
        return -1;//分配内存失败
    }
    printf("-------------------\n");
    for (int i=0;i<strlen(buf);i++) {
        p=&buf[i];//给指针变量赋值
        printf("p3=%d,p3=%c\n",p,*p);
    }

    printf("-------------------\n");
    //不断的改变p本身变量,跟p指向的内存块无关
    char *p1=NULL;
    p1 = (char *)malloc(100);
    strcpy(p1, "1434534633432311");
    for (int i=0; i<10; i++){
        p = p1+i;
        printf("%c ", *p);
    }

    return 0;
}

运行结果:


2、指针强化2
1间接赋值(*p)

int main()
{
    //指针指向谁就是把谁的地址赋值给指针
    int a=10;
    int *p;
    //建立关系
    p=&a;
    //通过*操作内存
    *p=20;
    printf("p=%d,a=%d\n",*p,a);
    //通过指针间接赋值
//    1两个变量
//    2建立关系
//    3通过*操作内存,进行修改
    return 0;
}
```运行结果:

2间接赋值(*p)是指针存在的最大意义
int get_value()
{
    int a=10;
    return a;
}
void get_value1(int a)
{
    a=20;
}
void get_value2(int *p)
{
    *p=33;
}
void get_value3(int *a1,int *a2,int *a3)
{
    *a1=12;
    *a2=13;
    *a3=14;

}
int main()
{
    //函数返回值
    int a=get_value();
    printf("a=%d\n",a);
    //实参函数传递
    get_value1(a);
    printf("a=%d\n",a);
    //如果想通过形参改变实参的内容,必须是地址传递
    get_value2(&a);
    printf("a=%d\n",a);
    //那return 也可以获得值得改变,为什么还用指针那
    //return只能返回一个值,那如是需要返回多个值怎么办
    int a1,a2,a3;
    get_value3(&a1,&a2,&a3);
    printf("a1=%d a2=%d a3=%d\n",a1,a2,a3);

    return 0;
}

运行结果:

3二级指针间接赋值

void get_str1(int *p)
{
    p=0xccdd;
    printf("get_str1:p=%p\n",p);//get_str1:p=0000CCDD
}
void get_str2(int **p)
{
    *p=0xdddd;
}
int main()
{
    int *p=0xaabb;//这里是直接给p附一个值
    printf("p=%p\n",p);//p=0000AABB通过%p打印地址

    get_str1(p);//是值传递,没有&都是值传递,并不改变
    printf("main_get_str1:p=%p\n",p);//p=0000AABB

get_str2(&p);//是地址传递
//地址传递,一个*地址传递,用两个*来接,由于是地址传递,指针指向谁就把谁的地址传递给指针,所以get_str2()中的p就指向了主函数中的p,在get_str2()中修改*p就是修改P指向的内存区域,所以能够修改p的地址。
    printf("main_get_str2:p=%p\n",p);//main_get_str2:p=0000DDDD

    return 0;
}

运行结果:

3、指针强化3
理解指针必须和内存四区概念相结合

void fun(char *p)
{
    //给p指向的内存区域拷贝内容
    strcpy(p,"abcdefg");
}
void fun1(char *p)
{
    if(p==NULL)//判断是否为空
    {
        return;
    }
    //给p指向的内存区域拷贝内容
    strcpy(p,"abcdefg");
}
void fun2(char **p,int *len)
{
    if(p==NULL)
    {
        return;
    }
    char *temp = (char *)malloc(100);
    if(temp==NULL)
    {
        return;
    }
    strcpy(temp,"abcdefgh");
    *p=temp;
    *len=strlen(temp);

}
int main()
{
    //输入,主调函数分配内存
    char buf[100]={0};
    fun(buf);
    printf("buf=%s\n",buf);//buf=abcdefg

    char *p1=NULL;
    fun1(p1);//注意不能给NULL指针拷贝内容

    //输出,被调用函数分配内容,地址传递
    char *p=NULL;
    int len=0;
    fun2(&p,&len);
    if(p!=NULL)
    {
        printf("p=%s len=%d\n",p,len);
    }

    return 0;
}

运行结果:

输出部分的四区图如下:

原文地址:https://blog.51cto.com/14165014/2453325

时间: 2024-10-17 20:14:40

6指针强化的相关文章

指针强化

定义: 内存地址(内存单元的编号) 从0开始的非负整数 范围是0-FFFFFFFF(0--4G-1) 指针变量是存放内存单元地址的变量 指针的本质是一个操作受限的非负数 #include<stdio.h> void main(){ int * p; //int * 是一个整型指针类型 p是一个变量 所有p是一个指向整型指针类型的变量 int i=10; int j; //p=10; //error p=&i; j=*p; printf("i=%d,j=%d,*p=%d,p=%

C学习之指针强化

char *p = (char *)malloc(100); malloc是用于分配内存的函数,它的参数为int型,表示分配多少个字节长度,其返回类型为void*,在这里用char*就是强制转化,指定了当前分配的内存用于存放char型数据,最后该函数会返回所分配内存空间的首地址赋予指针p

C中指针符*和取址符&amp;

申明:转载请注明出处! 学习了C语言之后,关于指针部分看了无数遍,有时候明明觉得自己看懂了,指针就是地址,但是总是在看代码时候糊里糊涂的搞不明白,最近又关于指针强化了一把. 大部分情况下对于程序中指针糊涂是因为不明白指针符“*”有两个作用: 第一,作为标识符,定义变量为指针,如int *p://只是说明变量p是指针变量,而没有实际意义. 第二,作为运算符,像+,—,运算符一样,如cout<<*p;//输出指针变量p所指向的内容. 一般在程序中,第一次出现的指针符*,是作为标识符,申明指针变量,

C 提高2 间接赋值(*p) 是指针存在的最大意义

1野指针强化: #include <stdio.h> #include <stdlib.h> #include <string.h> // 野指针产生的原因 //指针变量和它指向的内存空间变量是两个不同的概念 //释放了指针所指向的内存空间,但是指针变量本省没有重置为NULL //造成释放的时候,通过if(p1 != NUll) //避免方法: // 1)定义指针的时候,初始化成NULL // 2)释放指针所指向的内存空间,把指针重置成NULL int main() {

C语言提高内容目录

(1)基础 数据类型和变量 内存四区(栈 堆 全局 代码区) (2)指针和字符串操作 指针强化 字符串的基本操作 字符串一级指针内存模型图 字符串做为函数参数 (3)二级指针多级指针 二级指针的输入输出模型 二级指针输入的三种内存模型 多级指针的使用 (4)数组 一维数组  二维数组 数组类型  数组指针类型 数组指针类型变量 多维数组 (5)结构体 结构体的使用 (6)文件操作 文件读写操作 配置文件的读写案例(自定义接口) 文件的加密和解密案例(使用别写好的接口) (7)进阶知识 预处理 如

C提高_day03_两个辅助指针变量挖字符串(强化4)

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> //两个辅助指针变量挖字符串, 的第三种内存模型 //指针做函数参数 void FreeMem(char **myp,int count) //释放内存函数 { int i=0; if(myp == NULL) { return; } for(i=0;i<count;i++) { if

C提高_day03_两个辅助指针变量挖字符串(强化3)

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> //两个辅助指针变量挖字符串, 的第三种内存模型 //指针做函数参数 int spitString4(char *buf1,char c,char ***myp3,int *count) //**pp二级指针做输入 { char *p=NULL, *pTmp = NULL; int tmpc

C提高_day03_两个辅助指针变量挖字符串(强化2)

#include <stdlib.h> #include <string.h> #include <stdio.h> //两个辅助指针变量挖字符串, 的第三种内存模型 char ** spitString3(char *buf1,char c,int *count) //**pp二级指针做输入 { char *p=NULL, *pTmp = NULL; int tmpcount = 0; char **myp=NULL; //1 p和ptmp初始化 p = buf1;

三级指针四级存储空间的开辟~

三级指针四级存储空间 2015-05-15  青岛  张俊浩 今天在技术问答板块看到的帖子,花时间调出来,也顺便整理作为笔记~ 原帖是: #include<stdio.h> #include<stdlib.h> #include<string.h> char*** Create3DActiveArray(int x, int y, int z) { char ***pArr; int i, j,k; pArr = (char ***)malloc(x * sizeof(