基础
- 数组名=数组首元素指针
- 用数组名的解引用buf来访问第一个元素,也可以使用(buf+N)来访问第N个元素。
数组指针(类型为元素,类型为整个数组)和指针数组
- 指向数组的指针常被简称为数组指针(array pointer),包含两种情况一个是指向元素的首个元素地址,另一个是指向整个数组,虽然二者地址值相同,但是指针类型不同.
- 而具有指针类型元素的数组则被称为指针数组(pointer array)
- 主要应用是数组指针的第一种,既指向数组首元素的指针
#pragma warning(disable:4996)
# include <stdio.h>
# include <stdlib.h>
void main() {
int a[5] = { 1,2,3,4,5 };
printf("%x,%x", a, &a); // a和&a的地址是相同的,既数组名=数组首元素指针
printf("\n%d,%d", sizeof(*a), sizeof(*(&a))); // 但是a指针类型(*a)是数组的一个元素,而&a指针类型*(&a)是整个数组
int *p1 = a;//指向元素的指针,每个元素占四个字节
int(*p2)[5] = &a;//指向数组的指针,内存长度是所有元素的和//区别于int *p2[5],这个是建立了一个数组,数组的元素全是指针
printf("\n%d,%d", sizeof(*p1), sizeof(*p2)); //和sizeof(*a), sizeof(*(&a))等价
system("pause");
}
参考:http://c.biancheng.net/view/368.html
数组指针(元素)
数组变量名既是指针
- p=&a; //将变量地址赋值给指针
- p=array; //将数组地址赋值给指针
- p=&array[i]; //将数组元素赋值给指针
- p1=p2; // 将指针地址赋值给指针
#pragma warning(disable:4996)
# include <stdio.h>
# include <stdlib.h>
void main() {
int arr[10] = { 10 };//数组名是数组的首地址,是一个常量,它就是一个指针
for (int i = 0; i < 10; i++) {
printf("%d\n", arr[i]);//因为数组名=数组首元素指针,既arr就是一个指针类型,其大小是数组第一个元素大小
}
int* p = arr;
for (int i = 0; i < 10; i++) {//指向数组的指针,当操作指针的时候,间接操作
printf("%d\n", p[i]);//和printf("%d\n", arr[i]);本质相同,因为数组名=数组首元素指针,既arr就是一个指针类型,其大小是数组第一个元素大小
}
system("pause");
}
*(p+1)
和*p++
- 指针运算*(a+i)遍历数组
#pragma warning(disable:4996)
# include <stdio.h>
# include <stdlib.h>
void main() {
int a[5] = { 1,2,3,4,5 };
printf("数组名地址:%x,数组第一个元素地址:%x 相同\n", a,&a[0]);//打印数组的首地址
for (int i = 0; i < 5; i++) {//下标循环
//打印数组元素的值
printf("%d,%d\n", a[i], *(a + i));//a是一个地址值,a+1表示地址值前进一个该类型大小的字节
//打印数组元素的地址
printf("%x,%x\n", &a[i], a + i);
}
for (int *p = a; p < a + 5; p++) {//指针循环
printf("\n%d,%x", *p, p);
}
system("pause");
- 指针运算*a++遍历数组
#pragma warning(disable:4996)
# include <stdio.h>
# include <stdlib.h>
void main() {
int a[5] = { 1,2,3,4,5 };
for (int *p = a; p < a + 5; p++) {//*(p+1)和*p++意义不相同,前者没有改变p的地址,而后者改变了p的地址
printf("%d,%x\n", *p, p);
}
system("pause");
}
二维数组
a[i][j]=*((a+i)+j)
&a[i][j]=(a+i)+j
a[i]=*(a+i)
&a[i]=a+i
#pragma warning(disable:4996)
# include <stdio.h>
# include <stdlib.h>
void main() {
int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
printf("%x, %d", &a, sizeof(*&a));//&a是整个数组,长度4*3*3个字节
printf("%x, %d", a, sizeof(*a)); //a是行地址(二维数组中,行是一个元素,一维数组元素是一个元素),长度4*3字节
printf("%x, %d", *a, sizeof(**a)); //*a元素地址,长度4*1字节,多重指针
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d,%x ", a[i][j], &a[i][j]);
}
printf("\n");
}
printf("\n %x %x %x", *a, *a + 1, *a + 2);//分别代表第0行的第一/二/三个元素,地址每次前进4*1个字节
printf("\n %x %x %x", a, a + 1, a + 2);//分别代表第0行,第1行,第2行的地址,地址每次前进4*3个字节
system("pause");
}
指针数组
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 10;
int b = 20;
int c = 30;
int* arr[] = { &a,&b,&c };
//arr[0] == &a;
*arr[0] = 100;
printf("%d\t%d\t%d\t", a, b, c);
system("pause");
return 0;
}
参考:
https://www.cnblogs.com/downey-blog/p/10469906.html