Dayn指针2.0

1.二级指针

2.数组指针

3.指针数组

4.函数指针

二级指针

1.arr,&arr,&arr[0]的区别和联系

int main() {
    int arr[3] = { 0 };
    printf("arr=%p ,&arr[0]=%p ,&arr=%p ", arr, &arr[0], &arr);
}

共同点:指向的都是数组首元素的地址

不同点:1.

 int* p1 = &arr;(error)
    int* p2 = arr;(right)
    int* p3 = &arr[0];(right)

2.p++:能力不一样

 

二级指针

int a=10;
int*p =&a;(基类型是int 所以指针类型是int *)
int* *q=&p;(基类型是int*,所以指针类型是int**)
*q=p;(解引用一次:指向p)
p=&a; *p=a;
*q=&a;
**q=a;

 

int main() {
    int a = 10, b = 20;
    int* p = &a, * q = &b;
    int** p1 = &p, ** p2 = &q;
    printf("a=%d,b=%d\n", *p, *q);
    printf("a=%d,b=%d\n", **p1, **p2);
    printf("&a=%p,&b=%p\n", p, q);
    printf("&a=%p,&b=%p\n", *p1, *p2);
    p1 = &q;
    *p1= &a;
    **p1 = 20;
    p2 = &p;
    *p2 = &b;
    **p2 = 10;
    printf("a=%d,b=%d\n", *p, *q);
    printf("a=%d,b=%d\n", **p1, **p2);
    printf("&a=%p,&b=%p\n", p, q);
    printf("&a=%p,&b=%p\n", *p1, *p2);
}

通过结果更进一步了解二级指针

 

 

数组指针

指向一个数组的指针类型

1.int (*p)[3]=&arr;//指向的是int[3]数组

int main() {
    int arr[4] = { 1,2,3,4 };
    int(*p)[4] = &arr;
    printf("p=%d,p+1=%d\n", p, p + 1);
    int* q = &arr[0];
    printf("q=%d,q+1=%d\n", q, q + 1);
    int* r = arr;
    printf("r=%d,r+1=%d\n", r, r + 1);
​
}

所以&arr指针加一跨越n(数组长度)*(基类型)个字节

而&arr[0]==arr   -->+1后跨越1*基类型个字节

2.对数组指针的重命名(typedef)

unsigned long long int a=10;
typedef +类型名+变量名:就可以让变量名变成类型名;
typedef unsigned long long int a;
a b=10;//a 就不是变量名,实际是一个unsigened long long int 的数据类型
int arr[5]={1,2,3,4,5};
int (*p)[5]=&arr;--->int [5] (*p)=&arr;--->基类型是int [5]-->指针类型 int [5] (*x);
typedef int (*x)[5] ;-->x其实就是一个数组指针的类型;
x s=&arr;
 

3.使用数组指针遍历一维数组

#include<stdio.h>
int main() {
    int arr[3] = { 1,2,3 };
    int(*p)[3] = &arr;
    for (int i = 0; i <= 2; i++) {
        printf("%d\n", (*p) + i);
        printf("%d\n", (( * *p)+i));
​
    }
​
}

 

 

使用数组指针去遍历二维数组(2.0)

int main() {
    int arr[2][3] = { {1,2,3},{4,5,6} };
    for (int i = 0; i <=1; i++) {
        for (int j = 0; j <=2; j++) {
            printf("%d", arr[i][j]);
        }
    }
}

我们现在使用数组指针去遍历二维数组

int main() {
    int arr[2][3] = { {1,2,3},{4,5,6} };
    for (int i = 0; i <=1; i++) {
        for (int j = 0; j <=2; j++) {
            printf("%d",* (*(arr + i) + j));
        }
    }

 

指针数组

元素类型是指针的数组

const char*arr[3]={"abc","123","qaz"};
arr[0]="abc";
arr[1]="123";
arr[2]="qaz";
*arr[0]='h'-->error

 

 

上述无法改变字符串中的值;

char brr[][4]={"abc","qaz","wsx"};
//可以实现字符串中字符的改变
//列数>=字符串长度+1('\0')

全局变量和局部变量:

作用域不一样:全局变量:整个项目里面都是可以访问的 --》使用extern +全局变量;存储的位置是.data 数据区

局部变量:函数内定义的,函数内是有效的,出了就废了

存储位置:栈区

函数指针:定义一个指针指向函数

函数名含有:函数名的入口地址

函数指针类型 p =&func();

double func (int a,int b);
typedef double (*func) (int a,int b);--->函数指针类型,落脚点是指针

字符串操作 stdin 键盘-->文件 stdout 文件->屏幕

字符:scanf("%c",&a); printf("%c",a);

char value =getchar(); putchar(value);

getc();-->返回的是所输入字符的ASCII值 putc(value,stdout);

char value =getc(stdin);

字符串:strncmp

strncpy

strncat

strnlen

scanf("%s",arr); printf("%s",arr);

get_s() put_s()

fgets() fputs()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值