数组与指针
数组的名字是第一元素的地址。
#include <stdio.h>
int main(){
char str[128]={'a'};
printf("str 的地址是:%p\n", str);
printf("str[0] 的地址是:%p\n", &str[0]);
}
输出:
str 的地址是:000000000062FDC0
str[0] 的地址是:000000000062FDC0
数组相邻每一元素之间相差值 = 数据类型的宽度
#include <stdio.h>
int main(){
int a[3] = {1,2,3};
float b[3] = {1.1, 2.2, 3.3};
double c[3] = {1.1, 2.2, 3.3};
printf("a[0] -> %p a[1] -> %p a[2] -> %p\n", &a[0],&a[1],&a[2]);
printf("b[0] -> %p b[1] -> %p b[2] -> %p\n", &b[0],&b[1],&b[2]);
printf("c[0] -> %p c[1] -> %p c[2] -> %p\n", &c[0],&c[1],&c[2]);
}
输出:
a[0] -> 000000000062FE40 a[1] -> 000000000062FE44 a[2] -> 000000000062FE48
b[0] -> 000000000062FE30 b[1] -> 000000000062FE34 b[2] -> 000000000062FE38
c[0] -> 000000000062FE10 c[1] -> 000000000062FE18 c[2] -> 000000000062FE20
指向数组的指针:
#include <stdio.h>
int main(){
int a[3] = {1,2,3};
int *p = &a[0];
printf("*p = %d *(p+1) = %d *(p+2) = %d ",*p, *(p+1), *(p+2));
}
输出:
*p = 1 *(p+1) = 2 *(p+2) = 3
#include <stdio.h>
#include <string.h>
//strlen函数的实现
int main(){
char str[]="www.baidu.com" ;
char *tag = str;
int count = 0;
while(*tag++ != '\0'){
count++;
}
printf("strlen(str) = %d, count = %d",strlen(str),count);
}
输出:
strlen(str) = 13, count = 13
指针数组和数组指针:
指针数组
定义格式 :int *p[5];
//数组每一元素都是整形的指针,存放的地址
数组指针
定义格式 :int (*p)[5];
//指向数组地址的指针
#include <stdio.h>
int main(){
int tmp[5] = {2,3,4,5,6};
int (*p)[5] = &tmp;
for(int i = 0; i < 5; i++){
printf("%d\n", *(*p+i));
}
}
输出:
2
3
4
5
6
指针与二维数组
array[i][j];//二维数组
*(array+i)表示 &array[i][0] == array[i]
*(*(array+i)+j) 表示array[i][j]
#include <stdio.h>
int main(){
int array[2][3] ={{1,2,3}, {4,5,6}};
int (*p)[3] = array;
//其实array是指向三个元素的数组指针
printf("**(p+1) = %d\n", **(p+1));
printf("**(array+1) = %d\n", **(array+1));
printf("array[1][0] = %d\n", array[1][0]);
printf("*(*(p+1)+2) = %d\n", *(*(p+1)+2));
printf("*(*(array+1)+2) = %d\n",*(*(array+1)+2));
printf("array[1][2] = %d\n", array[1][2]);
}
输出:
**(p+1) = 4
**(array+1) = 4
array[1][0] = 4
*(*(p+1)+2) = 6
*(*(array+1)+2) = 6
array[1][2] = 6
void指针
定义:void *p
可以指向任一数据类型的指针
一般不对void指针解引用。可以先转化类型 再解引用
demo:
a = 123;
int *pi = &a;
void *pv = pi;
printf("%d", *((int *)pv);
指向指针的指针
#include <stdio.h>
//
int main(){
int num=520;
int *p=#
int **pp=&p;
printf("num=%d\n",num);
printf("*p:%d\n",*p);
printf("*pp:%d\n",**pp);
printf("&p:%p,&pp:%p\n",&p,pp);
printf("&num:%p,p:%p,*pp:%p\n",&num,p,*pp);//*pp==p==&num
}
输出:
num=520
*p:520
*pp:520
&p:000000000022FE38,&pp:000000000022FE38
&num:000000000022FE44,p:000000000022FE44,*pp:000000000022FE44
//数组指针与二维数组
#include <stdio.h>
int main(){
/*
int array[10]={0,1,2,3,4,5,6,7,8,9};
int *p=array;
int i;
for(i=0;i<10;i++){
printf("%d\n",*(p+i));
}
*/
int array[3][4]={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
// int **p=array;
int (*p)[4]=array;//4列
int i,j;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d ",*(*(p+i)+j));
// printf("%d ",*(*(array+i)+j));
}
printf("\n");
}
// printf("p:%p,array:%p\n",p,array);
// printf("p+1:%p,array+1:%p\n",p+1,array+1);
return 0;
}
输出:
0 1 2 3
4 5 6 7
8 9 10 11