数组指针:
定义一个指针变量,让这个指针变量指向一维数组的元素
二维数组指针
行指针,用来指向二维数组的每一行,存放的是行的首地址
定义格式: 数据类型 (*行指针变量名)[数组第二维的长度];
二维数组指针的初始化
int a[2][3];
int b[2][2];
float f1[4][4];
//假设我要定义一个指向数组a的一个行指针
// a = &a[0] = &a[0][0] = a[0]
int (*p)[3] = a;
二维数组指针的使用
*(*(p+i)+j) //就是获取二维数组的每个元素
实际操作:
int main(int argc, const char * argv[]) {
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
//二维数组指针
//二维数组指针可以替代数组名去使用
int (*p)[4] = a;
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
//遍历数组
printf("%d\t",*(*(p+i)+j));
}
printf("\n");
}
return 0;
}
指针数组喝二维数组指针的区别:
1.int *p[3]={&a,&b,&c};pa是一个指针数组;
2.int (*p)[3];这是一个二维数组指针;
前者表示一个指针数组,有三个下标变量p[0],p[1],p[2];
后者表示一个纸箱二维数组的指针变量。表示长度为3的一维数组或者说它的烈说为3;
字符串指针:
定义: char *字符串指针变量名 = "字符串内容";
用作:用来保存一个字符串
实际操作如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
//"zfbanzhang zaiyiqi" 这个字符串存储在常量去
//str 只保存了字符串常量的首地址
char *str = "zfbanzhang zaiyiqi";
//指针变量都是占用8个字节
printf("sizeof(str) = %ld\n",sizeof(str));
printf("str len = %ld\n",strlen(str));
//str是指针变量
//str重新指向另外一个字符串常量 "I LOVE YOU"
//保存的是 "I LOVE YOU" 字符串常量的首地址
str = "I LOVE YOU";
printf("%s\n",str);
char ch[]="abc"; //存在栈区
ch[2]='Z';
printf("%s\n",ch);
//读取字符串常量的某个字符
printf("%c\n",*(str+2)); //L
for (int i=0; i<strlen(str); i++) {
printf("%c\t",*(str+i));
}
//
//*(str+2)='X'; 错误的,因为字符串常量是在常量区存储
//在常量区保存的数据都是只读的
//str2 没有赋初值,野指针
char *str2=NULL;
//这句话的作用给先申请了100个字节的内存 str2
str2 = malloc(100);
printf("=======%s\n",str2);
//另外一种解决方案
char ch3[100];
char *str3=ch3;
scanf("%s",str3);
printf("----->%s\n",str3);
return 0;
}
一维字符数组
char ch[10]={'a','b'};
char ch1[]="abc";
二维字符数组
char ch2[3][10]={{'a','b'},{'b'},{'c'}};
用二维数组来保存多个字符串
//用二维的字符数组可以存储多个字符串
//第一维存的是每个字符串的首地址
//每个字符串的长度,不能超过第二维长度
char ch3[3][5]={"abc","def","kkkk"}
a b c \0 \0
d e f \0 \0
k k k k \0
ch[1][3] = 'Z';
实例操作如下:
#include <stdio.h>
int main(int argc, const char * argv[]) {
char ch3[3][5]={"abc","def","kkkk"};
//存放的是一个二维数组
ch3[1][3] = ‘Z’;//将第二行第四列的值改为z 也成为赋值;
for (int i=0; i<3; i++) {
printf("%s\n",ch3);
}
return 0;
}
char型指针数组和字符数组区别:
//char 类型的指针数组
char *name[3]={"abcdasfadsfasdfasdfasdf","def","kkk"};
for (int i=0; i<3; i++) {
//name
printf("%s\n",*(name+i));//这里打印的值可以直接谢伟name;
}
//字符串指针和字符数组的区别
//字符串指针:
char *ss = "abc";
//指向可以改变
//ss是一个指针变量
ss = "helloWorld!";
//字符数组:
char s1[]="abc";
//s1是数组名,是一个常量,不能被赋值,是不能改变的;
//s1 = "helloworld!";
字符串排序应用:
#include <stdio.h>
#include <string.h>
/**
* 实现字符串的排序
*
* @param arr <#arr description#>
* @param len <#len description#>
*/
void sortString(char *arr[],int len){
//冒泡排序
//临时存放地址
char *temp;
for (int i=0; i<len-1; i++) {
for (int j=0; j<len-i-1; j++) {
//arr[j] arr[j+1]
//比较字符串大小
if (strcmp(arr[j], arr[j+1])>0) {
//实现arr[j] arr[j+1]交换
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main(int argc, const char * argv[]) {
//输入5个国名并按字母顺序排列后输出。
char *name[]={ "CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};
for (int i=0; i<5; i++) {
printf("%s\n",name);
}
//字符串排序
sortString(name, 5);
printf("\n\n");
for (int i=0; i<5; i++) {
printf("%s\n",name);
}
return 0;
}
|
|