想当年学得比较晕的部分,近日整理了下
#include <stdio.h>
/*指针的基本概念,理解,应用,强制类型转换
初始化有三种方式:
int a,b = 1000,*pointer_a = &a,*pointer_b; 声明的同时初始化,也可先声明再初始化
*pointer_b = &b;pointer_b = pointer_a; 赋值,b指向a指的内存,要求两者数据类型一致
所有指针类型,均占四个字节的存储空间,类型不同的指针变量之间不能直接赋值,可以通过强制类型转换
void类型是万能类型,无需任何转换,可与其他类型相互赋值
例如:pointer_a = (int*)1245056 1245056是变量a的地址
*/
//实例1
#if(0)
#include <stdio.h>
int main(){
int a = 1000,*pointer_a = &a;
char ch,*point_ch;
point_ch = &ch;
ch = 'A';
*point_ch = 'B';
pointer_a = (int*)1245056; //把数值强制转换为指针类型,不可直接赋值 pointer_a = 1245054
printf("&a = %d,&ch = %d,pointer_a = %d\n",&a,&ch,pointer_a);
printf("ch = %c\n",ch);
printf("\n");
return 0;
}
#endif
/*
指针数组:array of pointers 用于存储指针的数组,元素都是指针
例如:int *p[10]=0; 定义了一个有十个元素的指针数组,0即为空指针
同*(apoiner_array[10]),因为[]优先级高于*
数组指针:a pointer to an array 指向数组的指针,例如int (*a)[4],元素表示(*a)[i]
数组的指针是数组在内存中占用的一片存储单元的起始地址
数组在内存中的起始地址就是数组变量名,也是数组中的第一个元素在内存中的地址
*/
//一维数组实例
#if(0)
int main(){
int a[9],*pa,total,i;
for(i = 0;i < 9;i++)
scanf("%d",&a[i]); //使用下标变量输入一列整数并求和
for(total = 0,i = 0;i < 9;i++)
total += a[i];
printf("a[0]+...+a[8] = %d",total);
}
#endif
#if(0)
int main(){
int a[9],*pa,total,i;
for(pa=a,i = 0;i < 9;i++) //数组名就是地址,无需加&
scanf("%d",&pa[i]); //使用地址常量输入一列整数并求和
for(total = 0,i = 0;i < 9;i++)
total += pa[i];
printf("a[0]+...+a[8] = %d",total);
}
#endif
#if(0)
int main(){
int a[9],*pa,total,i;
for(pa=a,i = 0;i < 9;i++)
scanf("%d",&pa+i); //使用指针变量输入一列整数并求和,pa+i = pa + sizeof(int)*i,等于数组第i个元素的地址
for(total = 0,i = 0;i < 9;i++)
total += pa+i;
printf("a[0]+...+a[8] = %d",total);
}
#endif
#if(0)
int main(){
int a[9],*pa,total,i;
for(pa=a;pa<a+9;pa++) //也可以用数组地址作为循环变量
scanf("%d",pa);
for(total=0,pa=a;pa<a+9;pa++)
total += *pa;
printf("a[0]+...+a[8] = %d",total);
}
#endif
#if(0)
int main(){
}
#endif
/*二维数组指针 int a[3][4]
二维数组在内存中是按行优先存储的,可以将首行视为一个特殊的元素,这个元素是一个一位数组
a是这个特殊的一维数组的名称,也就是首地址,即第一个元素(第一行)的地址,指的是一整行,称为行指针
行指针是一行所共有的,所以应该等于列数,二维数组的定义必须指定列数
a+0 = &a[0],a+1 = &a[1] //行指针
a[0] = &a[0][0],a[0]+1 = &a[0][1] //列指针,可以理解为行指针的具体元素,采用*或&进行转换
a[1][2] = *(a+1)+2
*/
//通过指针访问二维数组,关注以下实例中指针的移动,数组名作参数和指针作参数的区别
#if(0)
int main(){
int a[2][3] = {1,2,3,4,5,6};
int (*ptr)[3] = a; //指向二维数组的第一个元素,也就是第一行的地址
printf("%d\n",(*ptr)[1],(*ptr)[2]);
++ptr; //指针指向下一行
printf("%d\n",(*ptr)[1],(*ptr)[2]);
return 0}
#endif
#if(1)
void foo(int [][3]);
int main(){
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; //a代表a[0][0]
foo(a); //当整个数组作为函数的参数时,实际上是数组的地址作为函数的参数
printf("%d",a[2][1]);
return 0;
}
void foo(int b[][3])
{
++b; //形参得到该地址后指向同一数组
b[1][1] = 9; //修改后,该地址指向新的元素
}
#endif
/*
四种形式对应形式
实参 形参
数组名 数组名
数组名 指针变量名
指针变量名 数组名
指针变量名 指针变量名
*/
来源:CSDN
作者:NBella
链接:https://blog.csdn.net/NBella/article/details/103757128