一、字符指针
一般使用:
int main() { char ch = 'w'; char* pc = &ch; return 0; }
进阶使用:
int main() { const char* p = "abcd";//字符串常量的值是首字符的地址, //由于p指向的是常量字符串,所以*p解引用的时候不能改变这个字符串,所以前面用const来修饰 printf("%s\n", p); //打印字符串只需要知道字符串首字符的地址,然后就会一直往后打印直到遇到'\0'为止 //如果这里没有const修饰,通过解引用修改字符串常量程序会崩溃 /*char* p = "abcd"; *p='wcvb'; printf("%s\n", p);*/ //这三段代码执行后,虽然程序不会报错,但是会崩溃 //加了const修饰后,再通过解引p用去改变字符串常量程序就会报错 //*p = "dvcb";此时程序报错 return 0; }
经典例题:
//一个例题: int main() { char str1[] = "hello word."; char str2[] = "hello word."; //这两段代码执行后会在内存中创建两个数组,这两个数组有各自的空间 const char* str3 = "hello word.";//字符常量一般是放在内存中的只读常量区 const char* str4 = "hello word."; //"hello word."是一个常量字符串,永远不可能被修改掉,所以就没有必要创建两份,大家都共用这一份 //str3 和 str4里面存的都是 'h'的地址 if (str1 == str2)//数组名表示的是首元素的地址,由于两个数组开辟了各自的空间,所以它们首元素的地址一定不相同 printf("str1 and str2 are same\n"); else printf("str1 and str2 are not same\n"); if (str3 == str4)//str3 和 str4里面存的都是 'h'的地址,所以它们两个的值是相等的 printf("str3 and str4 are same\n"); else printf("str3 and str4 are not same\n"); //因为str3 和 str4里面存的都是 'h'的地址,我们可以把这个地址打印出来 //结果显示这两个地址是相同的 printf("%p\n", str3); printf("%p\n", str4); return 0; } //结果: str1 and str2 are not same str3 and str4 are same 00C27BD8 00C27BD8
二、指针数组
关于指针数组到底是指针还是数组?交给大家一个简单的方法:看后缀!这里的后缀是数组,就可以十分确定,指针数组其实就是数组。这里的指针我们可以看成是形容词,用来修饰数组的,就像整型数组:表示这个数组是用来存放整形数据的,字符型数组:表示这个数组是用来存放字符型数据的。同理:指针数组就表示这个数组是用来存放指针(地址)的。指针又分为:整型指针、字符指针等等,这也就导致指针数组也会分出很多的种类。
字符型指针数组:
用来存放字符地址的数组
//指针数组 int main() { const char* arr[4] = {"abcd","bcde","nmjh","lkju"}; //这就是字符型指针数组,这有一个叫arr的数组,它可以存放4个元素,每个元素都是 字符指针(存放的就是字符的地址) //数组中的4个元素都存的是字符串常量的首字符地址,由于指向的是字符串常量,不可被修改,所以加上const修饰 //打印出首元素的地址,发现字符串常量在内存中不是连续存放的 /*printf("%p\n", "abcd"); printf("%p\n", "bcde"); printf("%p\n", "nmjk"); printf("%p\n", "lkju"); printf("\n");*/ int i = 0; for (i = 0; i < 4; i++) { printf("%s\n", arr[i]);//调用数组中的元素 } return 0; }
int* arr1[10]; //整形指针的数组 char *arr2[4]; //一级字符指针的数组 char **arr3[5];//二级字符指针的数组
整型指针数组:
用来存放整型地址的数组
//整型指针数组 //这里有一个数组,里面存的都是整型指针(整形的地址) int main() { int arr1[5] = { 1,2,3,4,5 }; int arr2[5] = { 6,5,4,3,2 }; int arr3[5] = { 10,9,1,2,5 }; //创建三个整型指针 int* arr[3] = { arr1,arr2,arr3 };//数组名表示首元素地址 //这里有一个数组arr,它能够存储三个元素,每一个元素的类型都是整型指针(int*)(整形的地址) //arr1 - 1的地址 //arr2 - 6的地址 //arr3 - 10的地址 int i = 0; for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 5; j++) { //printf("%d ", arr[i][j]); printf("%d ", *(arr[i] + j));//arr[i]拿到的是数组首元素的地址,那再加j,就是跳过j个整型,就可以访问数组中的其他元素了。 } printf("\n"); } return 0; }