C语言指针1

来源:互联网 发布:淘宝店铺租赁平台 编辑:程序博客网 时间:2024/06/05 11:06

数组与指针

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

#include <stdio.h>int main(){    char str[128]={'a'};    printf("str 的地址是:%p\n", str);    printf("str[0] 的地址是:%p\n", &str[0]);}
输出:str 的地址是:000000000062FDC0str[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] -> 000000000062FE48b[0] -> 000000000062FE30 b[1] -> 000000000062FE34 b[2] -> 000000000062FE38c[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));    }}
输出:23456

指针与二维数组

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) = 4array[1][0] = 4*(*(p+1)+2) = 6*(*(array+1)+2) = 6array[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 34 5 6 78 9 10 11