C语言基础---指针数组----初始化方式&常量指针数组、指针常量数组

C语言基础---指针数组----初始化方式&常量指针数组、指针常量数组

文章目录

1.方式一:变量的地址放入数组中2.方式二:字符赋值3.方式三:字符串赋值4.为什么指针不能修改字符串、可以修改字符数组??5.常量指针数组----三点注意6.指针常量数组----三点注意

有关指针数组 & 数组指针的知识,详情可查阅: 《C语言基础—14.指针数组 & 数组指针—图解篇》

1.方式一:变量的地址放入数组中

#include

int main() {

char a = 'a';

char b = 'b';

char c = 'c';

char d = 'd';

char e = 'e';

char f = 'f';

char g = 'g';

char* array[5] = { &a,&b,&c,&d,&e }; // 把&a, &b看做是指向不同变量的指针

printf("array[0]--------%c\n", *array[0]);

printf("array[0]--------%x\n", array[0]);

printf("array[1]--------%c\n", *array[1]);

printf("array[1]--------%x\n", array[1]);

printf("\n");

*array[0] = 'f'; // 通过解引用修改数组的值,指针指向的地址不变

array[1] = &g; // 通过修改指针的指向,最终修改数组的值,指针变了

printf("array[0]--------%c\n", *array[0]);

printf("array[0]--------%x\n", array[0]);

printf("array[1]--------%c\n", *array[1]);

printf("array[1]--------%x\n", array[1]);

}

array[0]--------a

array[0]--------cffa8b

array[1]--------b

array[1]--------cffa7f

array[0]--------f

array[0]--------cffa8b

array[1]--------g

array[1]--------cffa43

2.方式二:字符赋值

#include

int main() {

char* array[5] = { 'a', 'b','c','d','e' };

char g = 'g';

printf("array[0]--------%c\n", array[0]);

printf("array[0]--------%p\n", &array[0]);

printf("array[1]--------%c\n", array[1]);

printf("array[1]--------%p\n", &array[1]);

printf("\n");

array[0] = 'f';

//&array[1] = &g; //表达式必须是可修改的左值

printf("array[0]--------%c\n", array[0]);

printf("array[0]--------%p\n", &array[0]);

printf("array[1]--------%c\n", array[1]);

printf("array[1]--------%p\n", &array[1]);

}

array[0]--------a

array[0]--------0099FDD4

array[1]--------b

array[1]--------0099FDD8

array[0]--------f

array[0]--------0099FDD4

array[1]--------b

array[1]--------0099FDD8

char* array[5] = { ‘a’, ‘b’,‘c’,‘d’,‘e’ };

指针数组本来应该存放的是指针的,但是初始化的时候数组里面直接是变量,可以理解为数组中存放的是指针的解引用(*p),即array[0] = ‘a’,array[0]是指向变量’a’的解引用

array[0] = ‘f’; 因array[0]是解引用,那么如上的赋值就相当是*p = ‘f’,即修改指针指向地址的值,而不改变指针的指向。

&array[1] = &g解释

因为array[1]的值,已经是’b’了,代表*p的含义, *p是具体的一个值,而&array[1] 就是这个值的具体地址,地址是无法被修改的!指针变量p能修改,变量的保存的值也可修改!所以这种写法是错误的!

3.方式三:字符串赋值

step1:单个指针指向字符数组

#include

int main() {

char array[] = "abcdef";

char* p = &array;

printf("sizeof(p)------%d \n", sizeof(p));

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

printf("*p-------------%c \n", *p);

}

sizeof(p)------4

p--------------abcdef //p指向了一个字符数组,通过%s可以打印出p指针指向的字符数组

*p-------------a //因为p指向了字符数组的首地址,所以*p显示字符数组的首元素

step2:指针数组指向二维字符数组

#include

int main() {

char* array[5] = { "abcdef","alien", "helloworld","ok","good" };

// array[0]/array[1] 这个相当于是单独的指针

//{ "abcdef","alien", "helloworld","ok","good" }是二维字符数组,第一层5个元素,每层是一个字符数组

printf("sizeof(array[0])---%d \n", sizeof(array[0]));

printf("array[0]-----------%s \n", array[0]);

printf("*array[0]----------%c \n", *array[0]);

printf("*array-------------%s \n", *array);

printf("**array------------%c \n", **array);

printf("\n");

printf("array[1]-----------%s \n", array[1]);

}

sizeof(array[0])---4 // 说明array[0]是一个指针,如果是字符数组,应该长度为6

array[0]-----------abcdef // array[0]可以打印出字符串,说明array[0]相当于一维字符数组中的p

*array[0]----------a // 同理,*p就是字符数组首元素的值

*array-------------abcdef // 因数组名也是指针,且是指向二维字符数组首元素的指针,所以*array指向第一个元素,*(array + 1) 指向第二个元素

**array------------a // 同理,**array指向第一个元素的第一个字符

array[1]-----------alien // array[1]相当于第二个指针,当然指向二维数组的第二个字符数组

char * array[5] = { “abcdef”,“alien”, “helloworld”,“ok”,“good” };

因数组的元素是一个指针,且这个指针指向了另一个字符数组。可以把array[0]看成是一个指向字符数组的一级指针!!!

#include

int main() {

char* array[5] = { "abcdef","alien", "helloworld","ok","good" };

printf("sizeof(array[0])---%d\n", sizeof(array[0]));

printf("array[0]-----------%s\n", array[0]);

printf("array[0]-----------%c\n", *array[0]);

printf("array[0]-----------%p\n", array[0]);

printf("\n");

// *array[0] = 'k';

array[0] = "ok";

printf("array[0]--------%s\n", array[0]);

printf("array[0]--------%p\n", array[0]);

}

sizeof(array[0])---4

array[0]-----------abcdef

array[0]-----------a

array[0]-----------00FF9B30

array[0]--------ok

array[0]--------00FF9B50 // 说明array[0]第一个指针的指向发生了转变

array[0] = “ok”;可以赋值的原因: array[0] 这种赋值,其实不是通过指针,只是把array[0]这个指针,指向了另一个变量“ok”,最终array[0]的地址变动了!!!

*array[0] = 'k’不能赋值的原因:

错误提示:写入位置oxood49B30时发shE那个访问冲突:char 与 char[3]的间接级别不同核心问题是:array[0]其实就是一个一级指针,相当于p指向了字符串"abcdef"。*array[0]指向字符串的第一个字母, 整个字符串都常量区,单个字符当然不能修改的,只读!!!如果想通过指针修改字符串,是把字符串保存在数组中修改的,因为数组是可变的。请看如下案例:

4.为什么指针不能修改字符串、可以修改字符数组??

case1:

#include

int main() {

char array[] = "abc"; // 数组array保存在栈区,可以修改的变量

char* p = array;

*p = 'd';

printf("array----------%c \n", *p);

printf("array----------%s \n",array);

}

array----------d

array----------dbc

case2:

#include

int main() {

char* p = "abc"; // 字符串"abc",保存在常量区,是不可修改的变量

*(p + 1) = 'd'; // 直接报错了!!

printf("p------------%s", p);

}

以上案例来源:https://blog.csdn.net/weixin_45481403/article/details/98971568

5.常量指针数组----三点注意

#include

int main() {

char abc[] = "abc";

char def[] = "def";

const char* array3[3] = { abc, def };

printf("array3[1]---------%p \n", array3[1]);

//char * const array3[2]; //1. error,定义的时候必须初始化,因为数组存储的是常量

//*array3[1] = 'e'; // 2. array3[1]相当于是一个二维指针,*array3[1]相当于第一个字符数组中的首元素

//array3[1][0]= 'e'; // 3. 这个与*array3[1]是相等的,提示不能给常量赋值

array3[1] = "666"; // 改变指针的指向是可以的!!

printf("\n");

printf("array3[1]--------%s\n", array3[1]);

printf("array3[1]---------%p \n", array3[1]);

return 0;

}

array3[1]---------0093F950

array3[1]--------666

array3[1]---------00829C20 // array3[1] 说明改变了指针的指向,从而修改了数组的值

6.指针常量数组----三点注意

#include

int main() {

char abc[] = "abc";

char def[] = "def";

char* const array[] = { abc, def }; // 注意,abc是字符数组变量,不是字符串!!!

// array[0] = "mmm"; // 1.const 修饰数组array,说明不能通过数组索引修改元素

array[0][0] = 'z'; // 2. array[0][0]相当于是*array[0],即通过指针的解引用赋值

printf("array[0]--------%s\n", array[0]);

printf("\n");

*array[0] = 'm';

printf("array[0]--------%s\n", array[0]);

}

array[0]--------zbc

array[0]--------mbc

3.指针常量数组:使用字符串初始化相当于const char *

#include

int main() {

char* const array[] = { "abc", "def" };

array[0][0] = 'z'; // 报错:因为指针array[0]指向的就是字符串,不能修改

printf("array[0]--------%s\n", array[0]);

printf("\n");

array[0] = "mmm"; // 报错:不能通过指针array[0]修改指针的指向

printf("array[0]--------%s\n", array[0]);

}

相关推荐

森海塞尔CX985评测导购
beat365唯一官网

森海塞尔CX985评测导购

📅 06-29 👁️ 1464
笔记本触摸屏关闭指南,轻松解决触摸屏开启问题,轻松关闭笔记本触摸屏,一键解决开启困扰
魅族21怎么截长屏
365bet滚球网

魅族21怎么截长屏

📅 06-29 👁️ 7970
米兔故事机怎么定时关机
365bet滚球网

米兔故事机怎么定时关机

📅 06-30 👁️ 4345
excel表四舍五入怎么取消
365bet滚球网

excel表四舍五入怎么取消

📅 06-30 👁️ 9184
《咏鹅》原文、译文、赏析(精选14篇)
监控sh365下载

《咏鹅》原文、译文、赏析(精选14篇)

📅 06-29 👁️ 2390
在 Windows 中安装和使用扫描程序
监控sh365下载

在 Windows 中安装和使用扫描程序

📅 06-30 👁️ 6366
iPhone XS怎么截图/截屏?iPhone XS两种截图方法
365bet滚球网

iPhone XS怎么截图/截屏?iPhone XS两种截图方法

📅 06-28 👁️ 1312
《炉石传说》40卡组版本各职业强度分析,助你选择最佳职业