C语言指针深度剖析

1.数组元素访问方式

1.一维数组访问数组元素的4种方法: 

1.下标法,用a[i]来访问数组元素; 
2.指针法,(ptr+i)形式间接访问; 
3.数组名,用(a+i)形式访问数组; 
4.指针下标法,ptr[i]形式访问数组元素; 

2.二维数组访问数组元素

# 1.直接访问法
printf("%d",a[i][j]);

# 2.指针访问法
int *ptr;ptr=a[0]; 
for(i=0;i<3;i++) 
    for(j=0j<4;j++) 
        scanf("%d",ptr++); 

2.指向二维数组的指针变量

类型说明符(*指针变量名)[长度]; 

int a[3][4]={{2.4.6.8},{10,12,14,16},18,20,22,24}; 
int (ptr)[4]; 
ptr=a; 

for(i=0;i<3;i++) 
    for(j=0j<4;j++) 
        printf("%4d",((ptr+i)+j)); 

其中(a+i)+j是二维数组a的i行j列的首地址。其元素的值为((a+i)+j);

3.函数指针

//函数指针变量的的定义形式一般为: 类型说明符 (*指针变量名)(); 

int add(int a,int b)
{
    return a+b;
}
void result(int (*ptr)(),int a,int b)
{
    int value;
    value=(*ptr)(a,b);
    printf("%d \n",value);
}

int main(){
	int (*ptr)();  //函数指针ptr
	ptr=add;
	result(ptr,1,2);
	result(&add,6,7);
	return 0;
}

4.指针函数

类型说明符 *函数名(形参表) {
    ......;
} 

例如:
int *pfun(int x,int y) {
    int z = x+y;
    return &z; 
}

void main(){
	int *p;
	p = pfun(3, 6);
    printf("%d \n", *p);
}

5.字符指针与字符数组的区别

(1)字符指针本身是一个变量,它的值可以改变,而字符数组的数组名虽然代表该数组的首地址,但它是常量,它的值不能改变。 
(2)赋初值所代表的意义不同 
对于字符指针 

char *ptr="hello world"; 
char *ptr,ptr="hello world"; 

对字符数组进行初始化 

char str[]="hello world";不能写为char str[80];str="hello world"; 

实际赋值时,只能对字符数组的各个元素逐个赋值

定义数组时,编译系统为数组分配内存空间,有确定的地址值,而定义一个字符指针时,低所指的指针是不确定的。

对于字符数组可以这样使用 
char str[80]; 
scanf("%s",str); 

对于字符指针,应申请分配内存,取得确定地址 
char *str; 
str=(char *)malloc(80); 
scanf("%s",str); 

这个情况会使程序很不稳定 
char *str; 
scanf(“%s”,str);

6.指针数组

类型说明 *数组名[数组长度];

例如:char*str[4];   指该指针数组包含4个指针。 

#include <stdio.h>
void main() 
{ 
    char *ptr1[4]={"Cat","Mouse","Dog","Sugar"}; 
    int i,*ptr2[3],a[3]={1,2,3},b[3][2]={1,2,3,4,5,6}; 

    for(i=0;i<4;i++) 
        printf("\n%s",ptr1[i]); 
    printf("\n"); 

    for(i=0;i<3;i++) 
        ptr2[i]=&a[i]; 

    for(i=0;i<3;i++) 
        printf("%4d",*ptr2[i]); 
    printf("\n"); 
    
    for(i=0;i<3;i++) 
        ptr2[i]=b[i]; 
    for(i=0;i<3;i++) 
        printf("%4d%4d\n",*ptr2[i],*ptr2[i]+1); 
}    

7.指向指针的指针

类型说明符 **指针变量名;

例如: 
float **ptr; 
其含义是定义一个指针变量ptr,它指向另一个指针变量(该指针变量又指向一个实形的变量)
由于指针运算符 * 是自右向左结合,所以上述定义相当于: 
float * *ptr;

8.指针运算小结

int i,j,a[10],b[5][9],*p,*q,(*pi)[9],*pa[5]; 
char *ps; 
char pas[]={"abc","defghij,kn"};  //字符常量的首地址分别赋给指针数组pas[0],pas[1],pas[2]; 
p=&i;  //将一变量地址赋给指针变量p 
q=p;  //p和q是指针变量,将p的值赋给q; 
q=null;  //将null空指针赋给指针变量q; 
p=(int)malloc(5*sizeof(int));//分配10个字节的储存单元,并把首地址赋给P 
p=a;//将a的首地址赋给指针变量P; 
p=&a[i];//将一维数组a的第i个元素赋给指针变量P 
p=&b[i][j];//将二维数组b[i][j]的地址赋给变量P 
pi=b+i;//等价pi=&b[i],将pi指向二维数组b的第i行 
for(i=0;i<5;i++) 
    pa[i]=b[i];//分别将二维数组b的第i行的第0列元素赋给 
ps="hello";//将字符串常量赋给指针变量ps。



 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值