指针数组 c语言,C语言之指针数组

本文详细探讨了指针数组和一维数组的概念,包括指针数组的定义、一维数组的特性以及指针与数组下标的关联。通过代码示例展示了指针如何用于遍历数组,强调了数组名作为指针常量的特性,以及指针运算在数组中的应用。同时,解释了二级指针的概念,并阐述了地址变量的表示方式。最后,讨论了在函数中传递数组参数的方式。
摘要由CSDN通过智能技术生成

指针数组

本质是数组 只是每个元素的类型是指针。

图示

6c1555302777729326ca3efa0910d9ec.png

代码示例

#include

int main() {

int num1 = 10;

int num2 = 20;

int num3 = 30;

int num4 = 40;

int *arr[4] = {&num1, &num2,&num3,&num4};

int n = sizeof(arr) / sizeof(arr[0]);

for (size_t i = 0; i < n; i++)

{

printf("%d ", *arr[i]);

}

return 0;

}

一维数组

代码示例

#include

int main() {

// 1.定义数组

int arr[5] = { 10,20,30,40,50 };

//arr作为类型

printf("sizeof(arr) = %d\n",sizeof(arr));//数组的总大小

//arr作为地址 代表首元素的地址

printf("arr = %u\n", arr);//int *

printf("arr+1 = %u\n", arr+1);

printf("arr[1] = %d\n", arr[1]);//20

printf("*(arr+1) = %d\n", *(arr+1));//20

printf("---------------------\n");

//arr[1]展开成*(arr+1):[]外边的值 在+的左边 []里面的值在+的右边

printf("*(1+arr) = %d\n", *(1 + arr));//20

printf("1[arr] = %d\n", 1[arr]);//20

//[] 是 *() 的缩写(重要)

for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)

{

//printf("%d ", arr[i]);

printf("%d ", i[arr]);

}

printf("\n");

//arr 作为地址 是首元素的地址

//&arr[0] == &*(arr+0) == arr+0 == arr

return 0;

}

程序运行结果

6c1555302777729326ca3efa0910d9ec.png

一维数组名

一维数组名是个指针常量,他存放的是一维数组第一个元素的地址 。

代码示例

#include

int main(void)

{

int a[5]; //a是数组名 5是数组元素的个数 元素就是变量 a[0] -- a[4]

//int a[3][4]; //3行4列 a[0][0]是第一个元素 a[i][j]第i+1行j+1列

int b[5];

//a = b;//error a是常量

printf("%#X\n", &a[0]);

printf("%#X\n", a);

return 0;

}

程序运行结果

6c1555302777729326ca3efa0910d9ec.png

总结

一维数组名是个指针常量。

它存放的是一维数组第一个元素的地址。

常量是不能被改变的,也就是说,一维数组名是不能被改变的。

数组名a存放的是一维数组第一个元素的地址,也就是a = &a。

下标和指针的关系

如果p是个指针变量,则p[i]永远等价于*(p+i)

# include

int main(void)

{

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

int i;

for (i=0; i<5; ++i)

printf("%d\n", a[i]); //a[i] == *(a+i)

return 0;

}

数组元素指针

代码示例

#include

int main() {

/**

* 需求:定义一个指针变量 保存arr数组元素的地址

*/

// 声明一个数组

int arr[5] = { 10,20,30,40,50 };

int *p = arr;//int *p; p=arr;

for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)

{

//printf("%d ", *(p + i));

printf("%d ", p[i]);

}

printf("\n");

printf("sizeof(arr) = %d\n", sizeof(arr));//20

printf("sizeof(p) = %d\n", sizeof(p));//4

/**

*不要认为p只能保存首元素地址

* 指针变量 起始指向哪儿? p[x] == *(p+x)

*/

int *p1 = &arr[2];

printf("p1[1] = %d\n", p1[1]);//40

printf("p1[-1] = %d\n", p1[-1]);//20

return 0;

}

程序运行结果

6c1555302777729326ca3efa0910d9ec.png

案例说明

#include

int main() {

int arr[5] = { 10,20,30,40,50 };

int *p = arr;

printf("%d\n", *p++);//10;; *p; p++

printf("%d\n", (*p)++);//20 ; *p; (*p) = (*p) +1

printf("%d\n", *(p++));//21

printf("\n");

return 0;

}

程序运行结果

10

20

21

同一数组的两个元素指针的关系

指向同一数组的两个元素指针变量相减,是两指针变量间元素的个数。

指向同一数组的两个元素指针变量相加,无意义。

指向同一数组的两个元素指针变量 p1 = p2(p1和p2指向同一处)。

一维数组需要几个参数

代码示例

# include

/*

a是个指针变量,所以上面局部函数f的pArr则要定义成指针函数才可以,而len则是int类型。

代表接收的是整型的数字。fmin函数可以输出任何一个一维数组的内容

*/

// 声明函数

void fmax(int * pArr, int len)

{

int i;

for (i=0; i

printf("%d ", pArr[i] ); //*pArr *(pArr+1) *(pArr+2)

printf("\n");

}

int main(void)

{

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

int b[6] = {-1,-2,-3,4,5,-6};

// 调用函数

fmax(a, 5); //a是 int *

fmax(b, 6);

return 0;

}

总结:

因为数组a的名称代表的是a的第一个元素的地址,所以在函数fmax中所定义的指针变量pArr和a是相同的,因为a也是指针变量类型。

也就是说pArr=a=a[0],pArr[1]=a[1]=*(pArr+1)=*(a+1),pArr[2]=a[2]=*(pArr+2) =*(a+2).

二级指针

图示

6c1555302777729326ca3efa0910d9ec.png

代码示例

#include

int main() {

int num = 10;

int *p = &num;

int **q = &p;

printf("&num = %u\n", &num);

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

printf("&p = %u\n", &p);

printf("q = %u\n", q);

printf("*q = %u\n", *q);

printf("**q = %u\n", **q);

return 0;

}

程序运行结果

&num = 6422036

p = 6422036

&p = 6422024

q = 6422024

*q = 6422036

**q = 10

地址变量

1、Sizeof(变量名/数据类型) 其返回值就是该变量或数据类型所占字节数

2、一个指针变量无论其指向变量占几个字节,其本身所占大小都是4字节。

3、*p具体指向几个字节,要靠前面类型确定,如果为int则为4字节,如果double则占8字节。

4、CPU与内存交互时有32根线,每根线只能是1或0两个状态,所有总共有232个状态。1 个状态对应 一个单元。

5、所有每个地址(硬件所能访问)的用4个字节保存(而不是一 位bit)

代码示例

# include

int main(void)

{

char ch = 'A';

int i = 99;

double x = 66.6;

char * p = &ch;

int * q = &i;

double * r = &x;

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

return 0;

}

总结

一个变量的地址—用该变量首字节的地址表示。这也就是为什么指针变量始终只占4字节的原因。

来源:https://www.cnblogs.com/Guard9/p/12905182.html

C语言中,数组指针和指针数组是两个重要的概念。数组指针是指一个指针,该指针指向一个有多个元素的数组。例如,`int (*parr)`表示一个指针parr,它指向一个有5个整数元素的数组。数组指针的本质是一个指针。 指针数组是指一个数组,该数组的元素都是指针。例如,`int* p2`表示一个包含4个整型指针的数组。指针数组的本质是数组。 在使用数组指针和指针数组时,我们必须清楚它们的本质和如何使用。数组指针通过指针的方式来访问二维数组,可以使用指针的指针运算符`*`和数组的下标运算符`[]`来访问数组元素。 指针数组通过数组的方式来访问二维数组,需要使用两层循环来遍历数组元素,并通过指针数组的下标运算符`[]`和间接访问运算符`*`来访问数组元素。 在C语言中,表示二维数组每行起始地址的方式有多种,可以使用数组名和下标、数组名和指针运算符`*`、数组名和指针运算符`&`来表示。不同的表示方式都可以得到相同的结果,即二维数组每行的起始地址。 综上所述,数组指针和指针数组C语言中的重要概念,它们分别表示一个指针和一个数组,用于访问二维数组。使用数组指针的方式可以通过指针运算符`*`和数组下标运算符`[]`来访问数组元素,而使用指针数组的方式需要使用两层循环,并结合指针数组的下标运算符`[]`和间接访问运算符`*`来访问数组元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值