C语言复习第一章:指针

前言

要复习C语言,不可避免得就要谈到指针,作为C语言的重点,也是C语言的难点,经过几天的复习,今天对指针做一个小结。

1. 指针的大小与什么有关系

1.cpu位数(32位数4字节,64位数8字节)
2.操作系统位数(32位数4字节,64位数8字节)
3.编译器的位数(32位数4字节,64位数8字节)

2.指针做形参

数组在做形参是会退化为指针.他会把数组首地址传送过来,而不是所有数组元素(C语言的优势:快捷高效)

3.指针作为函数参数的精髓,是C语言特有的现象,是C语言的精华,主函数和被调函数之间通过指针操作内存交换运算结果。

  1. 在主函数直接操作内存空间
int a;
char *p;`

a = 10;

printf("%d\n",&a);

//假设a在栈区的地址为0x123456;
*((int *)123456) = 200;
  1. 通过指针间接修改值
int a;
char *p;

a = 10;
p = &a;

*p = 200;

printf("%d\n",a)

  1. 通过函数指针间接修改值
int getNum(int *p)
{
    *p = 2;
}

int main()
{
    int a = 1;
    int *p = NULL;
    printf("%d\n",a);

    getNum(&a);
    //间接修改值
    printf("间接修改值:");
    printf("%d\n",a);

    return 0;
}
  1. 指针的精髓(二级指针间接赋值)
#include<stdio.h>
#include<stdlib.h>

int getNum3(char **p1,int *len1,char **p2,int *len2)
{
    char *tmp1 = NULL;
    char *tmp2 = NULL;
   
    tmp1 = (char *)malloc(100); //堆区申请空间
    strcpy(tmp1,"123456");//往内存中写值
    *len1 = strlen(tmp1);
    *p1 = tmp1;//与一级指针写值同理

    tmp2 = (char *)malloc(200);
    strcpy(tmp2,"654321");
    *len2 = strlen(tmp2);
    *p2 = tmp2;
}

int main()
{
    char *p1 = NULL;
    char *p2 = NULL;
    int len1 = 0;
    int len2 = 0;

    getNum3(&p1,&len1,&p2,&len2);	//通过一级指针和二级指针间接赋值和计算大小

    printf("%s   %s\n",p1,p2);//打印指针指向内存中的值不需要加*
    printf("%d   %d",len1,len2);
	
	//堆区释放
    if(p1 != NULL)
    {
        free(p1);
        p1 = NULL;//避免野指针

    }

     if(p2 != NULL)
    {
        free(p2);
        p2 = NULL;
    }
    
    return 0;
}
这里涉及到了部分内存四区的知识,在下一章进行补充。
发布了8 篇原创文章 · 获赞 5 · 访问量 271

猜你喜欢

转载自blog.csdn.net/qq_44004011/article/details/105317897