#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]
c++(数组和指针的详解)
最新推荐文章于 2025-07-08 19:32:53 发布