目录
指针数组:指针数组是数组,数组的每个元素是指针
字符型指针数组(冒泡排序)
->
#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.指针数组的数组名是二级指针