C语言指针1

数组与指针

数组的名字是第一元素的地址。

#include <stdio.h>

int main(){

    char str[128]={'a'};

    printf("str 的地址是:%p\n", str);
    printf("str[0] 的地址是:%p\n", &str[0]);



}
输出:
str 的地址是:000000000062FDC0
str[0] 的地址是:000000000062FDC0

数组相邻每一元素之间相差值 = 数据类型的宽度

#include <stdio.h>

int main(){

    int a[3] = {1,2,3};
    float b[3] = {1.1, 2.2, 3.3};
    double c[3] = {1.1, 2.2, 3.3};

    printf("a[0] -> %p a[1] -> %p a[2] -> %p\n", &a[0],&a[1],&a[2]);
    printf("b[0] -> %p b[1] -> %p b[2] -> %p\n", &b[0],&b[1],&b[2]);
    printf("c[0] -> %p c[1] -> %p c[2] -> %p\n", &c[0],&c[1],&c[2]); 
}
输出:
a[0] -> 000000000062FE40 a[1] -> 000000000062FE44 a[2] -> 000000000062FE48
b[0] -> 000000000062FE30 b[1] -> 000000000062FE34 b[2] -> 000000000062FE38
c[0] -> 000000000062FE10 c[1] -> 000000000062FE18 c[2] -> 000000000062FE20

指向数组的指针:

#include <stdio.h>

int main(){

    int a[3] = {1,2,3};
    int *p = &a[0];


    printf("*p = %d *(p+1) = %d *(p+2) = %d ",*p, *(p+1), *(p+2));


}
输出:
*p = 1 *(p+1) = 2 *(p+2) = 3
#include <stdio.h>
#include <string.h>
//strlen函数的实现 
int main(){

    char str[]="www.baidu.com" ;
    char *tag = str;
    int count = 0;

    while(*tag++ != '\0'){
        count++;
    }
    printf("strlen(str) = %d, count = %d",strlen(str),count);
}
输出:
strlen(str) = 13, count = 13

指针数组和数组指针:
指针数组

定义格式 :int *p[5];
//数组每一元素都是整形的指针,存放的地址

数组指针

定义格式 :int (*p)[5];
//指向数组地址的指针
#include <stdio.h>


int main(){
    int tmp[5] = {2,3,4,5,6};
    int (*p)[5] = &tmp;

    for(int i = 0; i < 5; i++){
        printf("%d\n", *(*p+i));
    }

}
输出:
2
3
4
5
6

指针与二维数组

array[i][j];//二维数组
*(array+i)表示 &array[i][0] == array[i]
*(*(array+i)+j) 表示array[i][j]
#include <stdio.h>


int main(){
    int array[2][3] ={{1,2,3}, {4,5,6}};
    int (*p)[3] = array;
    //其实array是指向三个元素的数组指针 
    printf("**(p+1) = %d\n", **(p+1));
    printf("**(array+1) = %d\n", **(array+1));
    printf("array[1][0] = %d\n", array[1][0]);

    printf("*(*(p+1)+2) = %d\n", *(*(p+1)+2));
    printf("*(*(array+1)+2) = %d\n",*(*(array+1)+2));
    printf("array[1][2] = %d\n", array[1][2]);
}
输出:
**(p+1) = 4
**(array+1) = 4
array[1][0] = 4
*(*(p+1)+2) = 6
*(*(array+1)+2) = 6
array[1][2] = 6
void指针
定义:void *p
可以指向任一数据类型的指针
一般不对void指针解引用。可以先转化类型 再解引用

demo:  
a = 123;
int *pi = &a;
void *pv = pi;
printf("%d", *((int *)pv);


指向指针的指针

#include <stdio.h>
// 

int main(){
    int num=520;
    int *p=&num;
    int **pp=&p;

    printf("num=%d\n",num);
    printf("*p:%d\n",*p);
    printf("*pp:%d\n",**pp);

    printf("&p:%p,&pp:%p\n",&p,pp);
    printf("&num:%p,p:%p,*pp:%p\n",&num,p,*pp);//*pp==p==&num


}
输出:

        num=520
        *p:520
        *pp:520
        &p:000000000022FE38,&pp:000000000022FE38
        &num:000000000022FE44,p:000000000022FE44,*pp:000000000022FE44

//数组指针与二维数组

#include <stdio.h>
int main(){
/*  
    int array[10]={0,1,2,3,4,5,6,7,8,9};
    int *p=array;
    int i;

    for(i=0;i<10;i++){
        printf("%d\n",*(p+i));
    }

*/
    int array[3][4]={
    {0,1,2,3},
    {4,5,6,7},
    {8,9,10,11} 
    };
//  int **p=array;
    int (*p)[4]=array;//4int i,j;

    for(i=0;i<3;i++){
        for(j=0;j<4;j++){
    printf("%d ",*(*(p+i)+j));
//  printf("%d ",*(*(array+i)+j));
        }
        printf("\n"); 
    }

//  printf("p:%p,array:%p\n",p,array);
//  printf("p+1:%p,array+1:%p\n",p+1,array+1);
    return 0;
} 
输出:
0 1 2 3
4 5 6 7
8 9 10 11
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值