一:指针与一维数组
int a[10],b[2][2];
printf("%p,%p",a,&a);
打印出结果相同,那么这里a和&a的区别是什么?
a是数组名是一个指针常量(不能进行自加..自运算)表示数组首地址。
&a指向整个数组,打印出来的是整个数组的首地址,表示数组的宽度;从而有&a+1-&a=10;(指针相减表示相差的数据类型的个数);
sizeof(a)=40;sizeof(&a)=4; 求一维数组宽度(类型)可以这样:sizeof(a)/sizeof(a[0]);
一维数组进行参数传递时可以直接使用数组名形参。我们知道传参传的是值,要对传递的变量进行值改变就必须传递地址。下面将解释用数组名作形参的特点;
有函数:main(){
int a[10];
fun(a);
}
void fun(int b[]){//形参数组名只是一个指针变量,不用申明长度,sizeof(a)=4;(指针的长度)
。。。
b[i]=b[i+1];//直接修改就能达到值改变;
}
因为:数组名为指针变量,int b[]相当于*p;
而*p=a;则有p[i]=a[i](等价于*p[i]=a[i]);一维数组中[]实际上是变地址操作,即将p[i]按p+i计算地址然后按此地址找出地址单元中的值,即p[i]=a[i];
********************************************************************************************************************************
二: 指针与 二位数组 多级指针
二位数组b[2][2]可以看成是两个一位数组b[0],b[1]; *b==b[0]
**b==b[0][0]
*(*(b+i)+j)==b[i][j];
求二维数组宽度(类型)可以这样:sizeof(b[0])/sizeof(b[0][0]);sizeof(b[0])就是一位数组b[0]的字节宽度;
小结:——:一维数组和二位数组部分初始化后,其余元素默认赋值0;
——:字符串存储时在末尾自动补\0;所以使用“”赋值时,必须定义长度为实际长度+1,a[]="abc",sizeof(a)=4; a[]={'a','b','c'};sizeof(a)=3;
*******************************************************************************************************************************
三:指针
——:指针:int a;char *p=&a;
char *p=&a与*p=a;在定义时char *P中表示p是char *类型的,而不是*p=a;而在使用时*p则表示a的值;
——:指针可以相减p1-p2表示中间数据类型的个数,但不能进行相加p1+p2运算;
——:定义指针时常为*p=NULL;使用时强转p=(类型*)(地址);用完后注意free(p);且p=NULL;
——:在应用中常常使用malloc,经常使用情况是函数调用中开辟空间用到二级指针,如形式:int main(*argc *argv[]){
int *str;
str=getmemory(&str,100);
strcpy(&str,"hello world!");
printf(“%s”,str);
free(str);
str=NULL;
return 0;
}
void getmemory(int **str,int n){
*str=(int *)malloc(n);
aseert(*str);//判断是否为空
return;
}
——:指针与函数:char * getmemory(。。。){ 。。}原理和上面强转相同,表示返回值是char *型(char型地址);
*******************************************************************************************************************************
四:const
const修饰与他右面最近的元素;
形式1:const int *p=&x;
int const *p=&x;
都表示p能改变,*p不能直接改变;const修饰int数据;
形式2:int *const p=&x;
与形式1相反,p不能直接改变,*p能改变;const修饰p;
形式3:const int *const p=&a;
综合了1与2;
阅读(1248) | 评论(0) | 转发(1) |