指针数组
#include <stdio.h>
int main(int argc,char *argv[]){
int *a[10];//定义一个指针数组,一共10个,其中每个成员都是int *类型的
printf("%d,%d\n",sizeof(a),sizeof(a[0]));
printf("----\n");
short *b[10];
printf("%d,%d\n",sizeof(b),sizeof(b[0]));
printf("----\n");
short *c[10];
printf("%d,%d\n",sizeof(c),sizeof(c[0]));
return 0;
}
80,8
----
80,8
----
80,8
Process finished with exit code 0
定义了指针数组,int *
,short *
,char *
,在64位系统下,其大小都是8个字节的,因为地址在64为系统下为8个字节,跟指针类型无关。只是他们是指向不同类型的指针而已。
二级指针
#include <stdio.h>
int main(int argc,char *argv[]){
int a=10;
int *p=&a;
int **pp=&p;//定义了一个二级指针,指向一个一级指针的地址
**pp=100;//通过二级指针修改内存的值
//*pp=10; 相当于将p指向了编号为10的这块内存,pp还是正常的指针,但p被修改成了野指针
printf("%d",a);
return 0;
}
指向多维数组的指针
#include <stdio.h>
int main(int argc,char *argv[]){
int buf[2][3]={
{
1,2,3},{
4,5,6}};
//int *p[3];//指针数组
int (*p)[3];//定义了一个指针,指向int[3]这钟数据类型,指向二位数组的指针
p=buf;//指向了二位数组的一行
//p++;//指向了第二行
printf("%d\n",sizeof(p));
printf("%d,%d\n",p,p+1);//位移了1*size(int[3])
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
printf("%d\n",*(*(p+i)+j));
}
}
return 0;
}
定义一个二位数组:int buf[2][3]
,buf代表数组的首地址
int buf[2][3] | 定义一个二位数组,buf代表数组的地址 |
---|---|
int (*p)[3] | 定义一个指向int[3]类型的指针变量p |
p[0],*(p+0),*p | 0行0列元素地址 |
p+1 | 第1行首地址 |
p[1],*(p+1) | 第1行0列元素地址 |
p[1]+2,*(p+1)+2,&p[1][2] | 第1行2列元素地址 |
(* p[1]+2,((p+1)+2),p[1][2]第1行2列元素的值 | 第1行2列元素的值 |
指针变量做为函数的参数
函数的参数可以是指针类型,它的作用是将一个变量的地址传递给另一个函数,通过函数的指针参数可以间接的实现形参修改实参的值。
c语言中所有需要修改函数内部修改实参的值,都需要通过将指针作为函数参数调用实现。
set_array(buf);
数组的值能被修改,因为数组的名字代表是数组的首地址->当数组名作为函数的参数时,c语言将数组名解释为指->数组名其实就是一个指针变量。
#include <stdio.h>
void print_array(int *buf,int n){
for(int i=0;i<n;i++){
printf("%d\n",*buf);
buf++;
}
}
int main(int argc,char *argv[]){
int buf[]={
1,2,3,4,5,6,7,8,9};
print_array(buf,sizeof(buf)/sizeof(int));
return 0;
}
二维数组名作为函数的参数
#include <stdio.h>
void print_array(int (*p)[3]){
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
printf("buf[%d][%d]=%d\n",i,j,p[i][j]);
}
}
}
int main(int argc,char *argv[]){
int buf[2][3]={
{
1,2,3},{
4,5,6}};
print_array(buf);
return 0;
}
buf[0][0]=1
buf[0][1]=2
buf[0][2]=3
buf[1][0]=4
buf[1][1]=5
buf[1][2]=6
Process finished with exit code 0
void print_array(int (*p)[3])
:将二位数组作为函数的参数传递的时候,定义的指针类型。[3]是不可以改变的。
#include <stdio.h>
//void print_array(int p[][3],int a,int b)