指针数组,数组指针,二级指针

 

目录

指针数组:指针数组是数组,数组的每个元素是指针

字符型指针数组(冒泡排序)

 字符型二维数组

数组指针:数组指针是指针,这个指针指向一个数组

 .二维数组和指针的关系

 二维数组传参

二级指针

总结:


指针数组:指针数组是数组,数组的每个元素是指针

 

字符型指针数组(冒泡排序)

->


#include<stdio.h>
#include<string.h>
int main()
{
    //指针数组m[i]保存的是字符串的首地址
    char *str[12]={"hello","world","how","are","you"};
    int j=0;
    int i=0;
    char *t=NULL;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4-i;j++)
        {
            if(strcmp(str[j],str[j+1])>0)//比较字符串传递字符串的首地址
            {
                t=str[j];          //字符串常量不能直接改变
                                 //交换数组中保存的各字符串的首地址
                str[j]=str[j+1];
                str[j+1]=t;
            }
        }
    }
    for(i=0;i<5;i++)
    {
        puts(m[i]);
    }
}

 字符型二维数组

pstr指针数组存放str[0],str[1],str[2],str[3],str[4],只改变pstr中str[0]~str[4]的顺序,原字符型二维数组存储的字符串顺序没变

#include <stdio.h>
#include <string.h>

int main(void)
{
	char str[5][32] = {0};
	char *pstr[5] = {str[0], str[1], str[2], str[3], str[4]};
	char *ptmp = NULL;
	int i = 0;
	int j = 0;

	/* 从终端接收字符串到二维数组中 */
	for (i = 0; i < 5; i++)
	{
		gets(str[i]);
	}

	/* 对指针数组指向的字符串排序 */
	for (j = 0; j < 4; j++)
	{
		for (i = 0; i < 4-j; i++)
		{
			if (strcmp(pstr[i], pstr[i+1]) > 0)
			{
				ptmp = pstr[i];
				pstr[i] = pstr[i+1];
				pstr[i+1] = ptmp;
			}
		}
	}
	
	/* 打印指针数组指向的字符串 */
	printf("================================\n");
	for (i = 0; i < 5; i++)
	{
		printf("%s\n", pstr[i]);
	}


	/* 打印二维数组中的字符串 */
	printf("================================\n");
	for (i = 0; i < 5; i++)
	{
		printf("%s\n", str[i]);
	}

	return 0;
}

数组指针:数组指针是指针,这个指针指向一个数组

 int a[5]={1,2,3,4,5};

a==&a[0]

a+1==&a[1]

*a==a[0]=1

&a:值为&a[],但是int(*p) [5]类型,表示是整个数组的首地址

&a+1为这个数组加20字节(数组长度)的地址

*&a降级为数组首地址,表示&a[0]

*(*&a))=a[0]

*(*&a+1)==*(a+1)=a[1]=2

数组指针的特性:

1.对一维数组&得到数组指针

2.数组指针取*操作:值不变,类型降级成为指向数组第一个元素的指针

3.数组指针变量偏移量为整个数组大小

#include <stdio.h>

int main(void)
{
	int a[5] = {1, 2, 3, 4, 5};
	
	printf("========================\n");
	printf("&a[0]:%p\n", &a[0]);
	printf("&a[1]:%p\n", &a[1]);
	printf("&a[2]:%p\n", &a[2]);
	printf("&a[3]:%p\n", &a[3]);
	printf("&a[4]:%p\n", &a[4]);
	printf("========================\n");
	printf("a:%p\n", a);
	printf("a+1:%p\n", a+1);
	printf("========================\n");
	printf("&a:%p\n", &a);
	printf("&a+1:%p\n", &a+1);
	printf("========================\n");
	printf("*a:%d\n", *a);
	printf("*(a+1):%d\n", *(a+1));
	printf("========================\n");
	printf("*&a:%p\n", *&a);
	printf("*&a+1:%p\n", *&a+1);
	printf("========================\n");
	printf("**&a:%d\n", **&a);
	printf("*(*&a+1):%d\n", *(*&a+1));

	return 0;
}

 .二维数组和指针的关系

  数组的数组名是指向数组第一行所有元素的数组指针

 

#include <stdio.h>

int main(void)
{
	int a[2][3] = {1, 2, 3, 4, 5, 6};

	printf("=========================\n");
	printf("&a[0][0]:%p\n", &a[0][0]);
	printf("&a[0][1]:%p\n", &a[0][1]);
	printf("&a[0][2]:%p\n", &a[0][2]);
	printf("&a[1][0]:%p\n", &a[1][0]);
	printf("&a[1][1]:%p\n", &a[1][1]);
	printf("&a[1][2]:%p\n", &a[1][2]);
	printf("=========================\n");
	printf("a:%p\n", a);
	printf("a+1:%p\n", a+1);
	printf("=========================\n");
	printf("a[0]:%p\n", a[0]);
	printf("a[0]+1:%p\n", a[0]+1);
	printf("a[1]:%p\n", a[1]);
	printf("a[1]+1:%p\n", a[1]+1);
	printf("=========================\n");
	printf("*a:%p\n", *a);
	printf("*a+1:%p\n", *a+1);
	printf("=========================\n");
	printf("**a:%d\n", **a);
	printf("=========================\n");
	printf("*(*a+1):%d\n", *(*a+1));
	printf("=========================\n");
	printf("*(*(a+1)+1):%d\n", *(*(a+1)+1));

	return 0;
}

 二维数组传参

传的a是指向数组第一行所有元素的数组指针类型


#include<stdio.h>
int Input(int (*p)[3],int len)
{
    int i=0;
    int j=0;
    for(i=0;i<len;i++)
    {
        for(j=0;j<3;j++)
        {
            scanf("%d",&p[i][j]);
        }
    }
    return 0;
}
int Output(int (*p)[3],int len)
{
    int i=0;
    int j=0;
    for(i=0;i<len;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%d ",p[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    int a[2][3]={0};
    Input(a,2);
    Output(a,2);
}

二级指针

1.函数体内想修改函数体外指针变量值的时候,传指针变量的地址即二级指针

2.指针数组的数组名是指向数组第一个元素的指针,即指向指针的指针也就是二级指针 

写一个函数改变一级指针p的值 

#include <stdio.h>

int fun(char **pptmp)
{
	*pptmp = "hello world";  //pptmp是二级指针,保存的是p的地址,*pptmp修改p的地址所对应的空间

	return 0;
}

int main(void)
{
	char *p = NULL;  

	fun(&p);  //传的是p的地址

	printf("p = %s\n", p);

	return 0;
}

总结:

1.指针数组:操作字符串数组
2.数组指针:在C语言中二维数组传参传数组指针和长度
3.二级指针:1.函数体内想修改外部指针变量值传入二级指针
           2.指针数组的数组名是二级指针

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值