一 C语言一级指针变量与一维数组
int data[5];
int *p;
p = data;
p[i] <=> data[i] <=> *(p + i)
<=> *(data + i)
注意:指针变量在保存了数组的首地址后,可以当作数组名来使用,不同的地方在于指针变量是一个变量,
可以改变它的值,而数组名是一个地址常量,不能更改它的值。
更深的理解:
data[i]访问数组中第i个成员,实际是通过 "数组首地址 + 成员偏移" 找到数组的成员
=>*(data + i);
data , &data[0],&data
他们的值是相等的,但是含义不一样
data是数组名,它只是标示数组的首地址
&data[0]标示获取数组第一个成员的地址
&data是取整个数组的地址(把它当作一种构造类型来处理)
练习:
int a[10] = {1,2,3,4,5,6,7,8,9,10};
输出这个数组的内容,四中形式
-
#include <stdio.h>
-
-
int main()
-
{
-
int i;
-
int *p;
-
int a[10] = {1,2,3,4,5,6,7,8,9,10};
-
-
for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
-
{
-
printf("%d ",a[i]);
-
}
-
printf("\n");
-
-
for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
-
{
-
printf("%d ",*(a + i));
-
}
-
printf("\n");
-
-
#if 0
-
for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
-
{
-
printf("%d ",*a ++);//错误,a标识数组的首地址,是一个地址常量,不能改变
-
}
-
printf("\n");
-
#endif
-
-
for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)
-
{
-
printf("%d ",p[i]);
-
}
-
printf("\n");
-
-
for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)
-
{
-
printf("%d ",*p ++);
-
}
-
printf("\n");
-
-
for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)
-
{
-
printf("%d ",*(p + i));
-
}
-
printf("\n");
-
-
return 0;
-
}
二 C语言一级指针变量与字符串常量
char *string = "hello word";
注意:"helloword"此时存放在字符串常量区,指针变量string保存了字符串的首地址,
字符串常量区内容是不可以修改的。
练习:
char *string1 = "asdfgh";
char *string2 = "efghi";
char buf[1024];
寻找string1和string2不相同的字符,然后存放在buf中,最后将buf的内容输出
for(q = string1;*q != '\0';q ++)
{
for(p
= string2; *p != '\0';p ++)
{
if(*p == *q)
break;
}
if(*p
== '\0')
//肯定'a'不在string2中,将它存在buf数组中
}
-
#include <stdio.h>
-
-
int main()
-
{
-
char *p,*q;
-
int count = 0;
-
char buf[1024];
-
char *string1 = "asdfgh";
-
char *string2 = "efghi";
-
-
printf("sizeof(string1) : %d\n",sizeof(string1));
-
printf("sizeof(*string1) : %d\n",sizeof(*string1));
-
-
for(p = string1; *p != '\0';p ++)
-
{
-
for(q = string2; *q != '\0';q ++)
-
{
-
if(*q == *p)
-
break;
-
}
-
-
if(*q == '\0')
-
{
-
buf[count ++] = *p;
-
}
-
}
-
-
for(p = string2; *p != '\0';p ++)
-
{
-
for(q = string1; *q != '\0';q ++)
-
{
-
if(*q == *p)
-
break;
-
}
-
-
if(*q == '\0')
-
{
-
buf[count ++] = *p;
-
}
-
}
-
-
buf[count] = '\0';
-
-
printf("buf : %s\n",buf);
-
-
return 0;
-
}
三 C语言的指针变量 与 二维数组
int a[3][2];
a[0][0]
--- a[0]:第0行的首地址 ---- a
a[0][1]
---------------------
a[1][0]
--- a[1]:第1行的首地址 ---- a + 1
a[1][1]
---------------------
a[2][0]
--- a[2]:第2行的首地址 ---- a + 2
a[2][1]
行指针(每次 + 1的时候,走动一行的大小) : a , a + 1 ,a + 2
列指针(每次 + 1的时候,组动一个数据元素的大小): a[0] ,a[1],a[2]
行指针 ---(加 *)---> 列指针
列指针 ---(加 &)---> 行指针
注意:只有在二维数组中,才区分行指针和列指针
====================================================================================
练习:获取a[1][1]成员的值,有那些写法?
a[1][1], *(&a[1][1]) ,
*(a[1] + 1) , *(a[0] + 3) => *(a[0] + 1(相隔的行数) * 2(每行的元素个数) + 1),
*(*(a + 1) + 1) , *(a[1] + 1)
=====================================================================================
-
#include <stdio.h>
-
-
int main()
-
{
-
int i = 0;
-
int j = 0;
-
int a[3][3] = {1,2,3,4,5,6,7,8,9};
-
-
for(i = 0;i < 3;i ++)
-
{
-
for(j = 0;j < 3;j ++)
-
{
-
printf("%d ",a[i][j]);
-
}
-
printf("\n");
-
}
-
-
printf("--------------------------\n");
-
-
for(i = 0;i < 3;i ++)
-
{
-
for(j = 0;j < 3;j ++)
-
{
-
printf("%d ",*(a[i] + j));
-
}
-
printf("\n");
-
}
-
-
printf("--------------------------\n");
-
-
for(i = 0;i < 3;i ++)
-
{
-
for(j = 0;j < 3;j ++)
-
{
-
printf("%d ",*(*(a + i) + j));//a[i] <=> *(a + i)
-
}
-
printf("\n");
-
}
-
-
printf("--------------------------\n");
-
for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)
-
{
-
printf("%d ",*(*a + i));
-
}
-
printf("\n");
-
-
int *p;
-
-
printf("--------------------------\n");
-
for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)
-
{
-
printf("%d ",*p ++);// *p , p = p + 1
-
}
-
printf("\n");
-
-
printf("--------------------------\n");
-
-
for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)
-
{
-
printf("%d ",p[i]);//*(p + i)
-
}
-
printf("\n");
-
-
printf("--------------------------\n");
-
-
for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)
-
{
-
printf("%d ",*(p + i));
-
}
-
printf("\n");
-
-
return 0;
-
}
//错误的理解
int **p;
p = a;//a不是一级指针变量的地址,它是数组名,在二维数组中,它是行指针类型
练习:
int a[3][3] = {1,2,3,4,5,6,7,8,9};
用5中形式输出二维数组的内容
=====================================================================================
思考:如何定义一个行指针类型变量?
数据类型 (*行指针变量名)[一行元素的个数];
int (*p)[3];//行指针变量p,每次+1 ,每次走动3个 int型数据大小
int *p[3];//指针数组
练习:如何定义一个指针变量保存数组int a[3][4]的首地址a?
int (*p)[4];
-
#include <stdio.h>
-
-
int main()
-
{
-
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
-
int (*p)[4];//行指针变量
-
-
p = a;
-
-
p ++;
-
-
printf("%d\n",**p);//此时p是行指针类型,*p将行指针变列指针
-
//* (*p) 此时从列指针的地址取值
-
-
p = a;
-
-
printf("%d\n", *(p[2] + 1));
-
-
printf("%d\n", *(*(p + 2) + 1));
-
-
return 0;
-
}
p = a;
a[i][j] <=>p[i][j] <=> *(a[i] +
j) <=> *(p[i] + j) <=> *(*(a + i) + j) <=> *(*(p+i) + j)
此时p和a的区别,p是一个变量,可以改变,a是一个地址常量不能改变.
p ++; //移动16字节,4个int数据
======================================================================================
练习:给一个三行4列的二维数组输入值(从键盘上输入),然后用一个行指针变量输出而维数组的内容
(之少5中输出方法)
-
#include <stdio.h>
-
-
int main()
-
{
-
int j;
-
int i = 0;
-
int a[3][4];
-
int (*p)[4];
-
-
printf("Input : ");
-
-
for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)
-
{
-
scanf("%d",a[0] + i);
-
//scanf("%d",*a + i);
-
}
-
-
p = a;
-
-
for(i = 0;i < 3;i ++)
-
{
-
for(j = 0;j < 4;j ++)
-
{
-
printf("%d ",p[i][j]);
-
}
-
printf("\n");
-
}
-
-
for(i = 0;i < 3;i ++)
-
{
-
for(j = 0;j < 4;j ++)
-
{
-
printf("%d ",*(p[i] + j));
-
}
-
printf("\n");
-
}
-
-
for(i = 0;i < 3;i ++)
-
{
-
for(j = 0;j < 4;j ++)
-
{
-
printf("%d ",*(*(p + i) + j));
-
}
-
printf("\n");
-
}
-
-
for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)
-
{
-
printf("%d ",*(a[0] + i));
-
}
-
printf("\n");
-
-
for(i = 0;i < 3;i ++)
-
{
-
for(j = 0;j < 4;j ++)
-
{
-
printf("%d ",*(*p + j));
-
}
-
p ++;
-
printf("\n");
-
}
-
-
for(i = 0,p = a;i < sizeof(a)/sizeof(a[0][0]);i ++)
-
{
-
printf("%d ",*((int *)p + i));
-
-
}
-
return 0;
-
}
阅读(994) | 评论(0) | 转发(0) |