c++(数组和指针的详解)

本文深入探讨了C语言中指针的应用,包括一级指针、二级指针的使用方法及注意事项,指针作为函数参数的不同方式,以及指针数组与数组指针的区别。通过实例展示了如何正确地使用指针来提高程序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define _CRT_SECURE_NO_WARNINGS
#include<string>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
/*----------------------------开始--------------------------------*/
/*
2018.3.21
11_指针做函数参数
*/
int getMen(char *p)
{
    p = (char *)malloc(sizeof(char)* 10);
    if (p == NULL)
    {
        return -1;
    }       
    strcpy(p, "qdfsfsd");
    return 0;
}
int main1(void)
{
    char *p =NULL;
    int ret = 0;
    ret = getMen(p);
    if (ret != 0)
    {
        printf("getMen err:", ret);
    }
    printf("%s", p);

    return 0;
}
/*
2018.3.21
_二级指针做函数参数输出
*/
int getMen2(char **p)
{
    char *tem = (char*)malloc(sizeof(char)* 10);
    if (tem == NULL)
    {
        return -1;
    }
    strcpy(tem, "hhahhah");
    *p = tem;
    return 0;
}
int main2(void)
{
    char *p = NULL;
    int ret = 0;
    ret = getMen2(&p);
    if (ret != 0)
    {
        printf("getMen err:", ret);
    }
    printf("%s", p);
    system("pause");
    if (p != 0)
    {
        free(p);
        p = NULL;
    }
    return 0;

}
/*
2018.3.21
_指针数组的使用
*/
int main3(void)
{
    char *p[] = { "fsdfs", "ssdfs", "fsdfs" };
    //指针数组,他是一个数组,每个元素都是指针char*
    //数组做实参,数组退化成一个指针。指针数组就退化成二维指针。
    char a[][30] = { "TRUWURUQ", "HFJHASJFS" };
    //a 代表首行地址,首行地址和首行首元素,但是他们的值是一样的。
    //&b代表整个一维数组的地址 相当于二维数组首行地址
    //b代表一维数组首元素地址,相当于二维数组首行首元素地址
    //&b 和 b的值虽然一样,但是,他们步长不一样 ,下面程序演示
    char b[30];
    printf("&b:%d,&b+1:%d",&b,&b+1);
    printf("\n");
    printf("b:%d,b+1:%d",b,b+1);
    system("pause");
    return 0;
}
/*-----------------------------------完-----------------------------------*/
/*
2018.3.22
17_二级指针的第三种内存模型 
*/
int main4()
{
    char a[10] = {0};
    char *p = (char *)malloc(10 * sizeof(int));//相当于p[10]
    //动态分配一个数组,每个元素都是char*,*buf[10]
    int n = 10;
    char **buf = (char **)malloc(n*sizeof(char *));//char *buf[10] 但是没有分配空间
    int i;
    for(i = 0;i<n; i++)
    {
        buf[i]=(char *)malloc(sizeof(char)* 30);
        char tem[30] = "jjjjj";
        strcpy(buf[i],tem);
    }
    for (i = 0; i < n; i++)
    {
        printf("%s\n", buf[i]);
    }
    system("pause");
    for (i = 0; i < n; i++)
    {
        if (buf[i] != NULL)
        {
            free(buf[i]);
            buf[i] = NULL;
        }
    }
    if (buf != NULL)
    {
        free(buf);
        buf = NULL;
    }
    return 0;
}
/*---------------------------------完———————--------------------------------*/
/*
2018.3.22
18_二级指针的三种内存模型,第三种在上面。
*/

int main5(void)
{
    //指针数组
    char  *p1[] = { "123", "456", "789" };
    //二维数组
    char p[3][4] = { "123", "456", "789" };
    return 0;
}

/* ---------------------------------完---------------------------------------------*/
/*
2018.3.26
_一维指针的使用
*/

int main6(void)
{
    //sizeof()测变量所占的空间(变量所对应类型的空间)
    // 数组类型:由元素个数和元素类型对应int[8]
    int a[] = {1,23,4};
    return 0;
    //有typedef是类型 没有是变量
    typedef int A[8]; //代表数组类型
    A b;//int b[8] ,去了typedef b替换到了A的位置

}
/*---------------------------------------完---------------------------------------*/
/*
2018.3.26-2018.3.27
_指针数组与数组指针
*/
int main7(void)
{
    int i=0;
    int a[10] = {0};
    //指针数组 ,首先是数组,每个元素都是指针
    char *a[] = { "dad", "dada", "dadad" };
    // 数组指针 ,它是指针,指向一个数组的指针。
    //定义数组指针变量
    //1.先定义数组类型 ,根据类型定义指针变量
    typedef int A[10];
    A *p = NULL;//p数组指针类型变量
    p = &a;//数组指针指向一维数组整个数组的地址。
    return 0;

}
/*---------------------------------------完---------------------------------------*/
/*
2018.3.27
14_数组指针强化
*/
int main8(void)
{
    int i;

    int a[10] = { 0 };
    // 3.先定义数组指针类型 根据类型定义变量
    //() 和[]的优先级一样 
    //指向数组的指针,它有typedef 所以是一个数组指针类型.去掉typedef ,就是一个数组变量。
    typedef int(*P)[10];
    P q;//数组指针变量
    q=&a;//数组指针指向一维数组整个数组的地址。
    for (i = 0; i < 10; i++)
    {
        (*q)[i] = 2*i + 1;
    }
    for (i = 0; i < 10; i++)
    {
        printf("%d\n", (*q)[i]);
        system("pause");
    return 0;
}

/* ------------------总结---------------------------*/
/*
2018.4.1
_二维数组数组名
*/
int main(void)
    {
    a[][4] = {
        { 1, 2, 3, 4 }
        { 5, 6, 7, 8 }
        {9,10,11,12}
            }

    //a:代表第0行首地址
    //a+i ->a[i]:代表第i行首地址
    //*(a+i):代表第i行首元素地址
    //*(a+i)+j -> &a[i][j]:第i行j列元素的地址
    //*(*(a+i)+j) ->a[i][j]: 第i行j列的元素的值

}

// 二维数组做实参 退化成指针  用数组指针做形参 int(*p)[3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值