C语言如何制作dIL文件,C语言学习笔记———指针

这篇博客详细讲解了C语言中指针与数组的相关知识,包括指针数组、一维指针、二维数组指针的使用和运算,以及字符串指针的概念。通过实例展示了如何访问和操作数组及字符串,探讨了指针在数组操作中的作用和常见用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

************************************************************************************************************

数组名是一个常量 因此不能用自加自减运算符 ++ --;

********************************************************************************************************

一维指针数组

int *pa[3];//指针数组,数组名是pa,可以存放3个指针(必须是int型变量的指针)

int a=3,b=4,c=5;

int *pa[3]={&a,&b,&c};

//pa[0]存储的是a的地址

//pa数组的首地址,pa==&pa[0]

printf("*pa[0]=%d\n",*pa[0]);//访问a的值

printf("*pa[0]=%d\n",*(&a));//访问a的值

printf("**pa =%d",**pa);//使用数组名访问a的值,pa是数组的首地址,*pa代表一维指针数组首地址所对应存储的值也就是pa[0]的值即&a,**pa就等同于*(&a)

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

int *pa1[2]={a1[0],a1[1]};

printf("**pa1=%d\n",**pa1);//用一维指针数组的首地址,访问a1[0][0]的值

printf("**(pa1+1)=%d\n",**(pa1+1));//用一维指针数组的首地址,访问a1[0][1]的值

********************************************************************************************************

指针变量之间运算

常见的用法:

两个指针都指向同一数组

i,判断两个指针变量指向的元素是否连续

ii,判断两个指针变量之间相隔几个元素;

注意:两个指针变量之间只有减法运算 如果两个指针变量指向同一个元素, 那么他们相减的结果是0 如果两个指针变量指向的元素相邻,他们相减的结果是1的 绝对值

两个指针变量之间的关系运算

//p1>p

//1 表示p1在高位

//0 表示p在高位或者指向同一个位置

********************************************************************************************************

用数组名访问二维数组

int a[3][4]={{1,3,5,7}, {9,11,13,15}, {17,19,21,23}};

//列指针

//a[0]==&a[0][0] a[0]+1==&a[0][1] a[0]+2==&a[0][2]

printf("&a[0][1]=%p\n",&a[0][1]);

printf("a[0]+1 =%p\n",a[0]+1);

printf("a[0][1] =%d\n",a[0][1]);

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

printf("&a[0][2]=%p\n",&a[0][2]);

printf("a[0]+2 =%p\n",a[0]+2);

/a+j == &a[j]

//行指针

//a+1 第二行的首地址

//a+2 第三行的首地址

printf("a[1]=%p\n",a[1]);

printf("a+1 =%p\n",a+1);

printf("a[2]=%p\n",a[2]);

printf("a+2 =%p\n",a+2);

//a+1 第二行第一个元素的地址

//*(a+1)==&a[1][0]

printf("*(a+1) =%p\n",*(a+1));

printf("&a[1][0]=%p\n",&a[1][0]);

printf("&a[1]=%p\n",&a[1]);

//*(a+j) 获取数组a[j]的值

//a== *(a+i)  符合一维数组的用法 因此二维数组也是特殊的一维数组

//*(*(a+i)+j) == a[j]

int i=0,j=0;

for(i=0;i<3;i++) { for(j=0;j<4;j++)

{

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

}

********************************************************************************************************

普通指针访问二维数组

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

{9,11,13,15},

{17,19,21,23}};

int *p=a;

int i;

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

{

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

}

********************************************************************************************************

int a[3][4];

int (*p)[4];//该语句是定义一个数组指针,指向含4个元素的一维数组。

p=a;//将该二维数组的首地址给p,也就是a[0]或&a[0][0]

p++;//该语句执行过后,也就是p=p+i;;跨过a[0][]指向了行a[1][]

数组指针:

定义一个指针变量,让这个指针指向一维数组的元素

二维数组指针

行指针,用来指向二维数组的每一行,存放的是行的首地址

定义格式:数据类型(*行指针变量名)[ 数组第二维的长度];

二维数组指针的初始化

int a[2][3];

int b[2][3];

float f1[4][4];

//假设我要定义一个指向数组a的一个行指针

//a == &a[0] ==&a[0][0] == a[0]

int (*p)[3]=a;

二维数组指针的使用

*(*(p+i)+j)

int a[3][4]={{1,3,5,7},{9,11,13,15},

{17,19,21,23}};

int i,j;

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

{

for(j=0;j<4;j++)

{

printf("%d\t",*(*(a+i)+j));;

}

}

//二维数组指针

//二维数组指针可以替代数组名去使用

int (*p)[4]=a;

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

{

for(j=0;j<4;j++)

{

printf("%d\t",*(*(p+i)+j));;

}

}

********************************************************************************************************

指针数组与二维指针数组的区别

int *pa[3]={&a,&b,&c};//pa是一个指针数组

int *pa1[2]={a[0],a[1]};

int (*pa)[3];//二维指针数组

二维数组指针变量是单个的变量,其一般形式中"(*指针变量名)"两边的括号不可少

而指针数组类型表示的是多个指针(一组有序指针)在一般形式中"*指针数组名"两边不能有括号

********************************************************************************************************

字符串指针介绍及使用

字符串指针:

字符串指针指向字符串

char *变量名="字符串内容";//“字符串内容是常量”

char *str="abc";

char ch='b';

char *p1=&ch;

注意: 字符数组是保存在栈里的

字符指针保存的是制定出常量地址,常量区是只读的 不可修改

//str只保存了字符串常量的首地址

char *str="woaibiancheng";

//指针变量只占八个字节

str="i love you";//str这个指针改变了指向

printf("strlen=%ld\n",strlen(str));

printf("%s\n",str);

char ch[]="abc";

ch[2]='z';

printf("%s\n",ch);

//读取字符串常量的某一个字符

printf("%c\n",*(str+2));

//*(str+2)='X';错误的,因为字符串常量保存在常量区

char *str2=NULL;

str2=malloc(100);//这句话的作用申请了100个字节的内存 str2  头文件stdilb.h

scanf("%s",str2);

printf("%s\n",str2);

char ch3[100];

char *str3=ch3;//str指向ch3

scanf("%s",str3);

printf("%s\n",str3);

********************************************************************************************************

二维字符指针数组概念

char *name[3]={"abcasdadadafaf","def","kkk"};

//char 类型的指针数组

int i; for(i=0;i<3;i++)

{

printf("%s\n",name); printf("%s\n",*(name+i));

}

//字符串指针和字符数组的区别

//字符串指针:

char *ss ="abc";

//指向可以改变

ss="hello world";

//字符数组:

char s1[]="abc";

//s1="hello world";数组名是个常量,不能被赋值

********************************************************************************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值