iOS学习笔记---c语言第八天

指针

首先将变量a的地址存放在另一个变量中,比如存放在变量b中,然后通过变量b来间接引用变量a,间接读写变量a的值。用来存放变量地址的变量,就称为"指针变量"

int *p=null;   初始值:null恒等于0          变量类型:整型指针 int *

指针变量所占字节数只于操作系统有关

指针类型转换符%p

printf("p = %p ",p);

    //c语言定义指针的时候,喜欢使用p,q,r等。
    int *p = NULL;
    //我们通常所说的指针,指的是指针变量
    //指针变量时存放内存地址(内存编号)的变量。
    printf("%p",p);

取地址符&

int a = 3; int *p = &a;

取值运算符*

    int a = 3;
    int *p = &a;
    printf("%d
",*p);
    char c = 'd';
    char *q = &c;
    printf("%c
",*q);

指针的赋值代表指针的重指向。

 

 指针的算术运算    只有加减运算

int*p = &a;         注意:指针类型决定移动几个字节

p++;//向高位移动四个字节

p--;//向低位移动四个字节

数组的内存地址

数组;用连续内存空间存储数据的构造类型                数组名:数组元素首地址

eg:int array[3]={1,3,8};//array 恒等于 &array[0]

    int arr[5] = {10,78,25,56,24};
    int *p = arr;
    *(p+2) = 52;//间接操作
    arr[2] = 52;//直接操作
    for (int i = 0; i<5; i++) {
        printf("%d ",arr[i]);
    }

数组名是一个常量指针 不能被修改  下面是错误写法     arr=p;  //arr是常量数组名,p是指针变量

 指针与数组的区别

1.所占空间不同

-指针:只于操作系统位数有关

-数组:与元素个数和类型有关

2.数组名是常量地址,不能被赋值

思考:数组元素类型和指针类型不匹配会怎么样?

    short a[4] = {3,7,9,1};
    int *p1 = a;
    char *p2 = a;
    printf("%d
",*p1);
    printf("%d",*p2);

//输出458755         3                    从低到高   00000011   00000000    00000111    00000000     00001001  00000000   00000001   00000000

int *p1  中a变成   00000000   00000111  00000000   00000011    四个字节

char *p2   中a变成   00000011     一个字节

指针与字符串

字符指针可以操作单个字符,也可以操作字符串。

    char string[] = "iphone";//string为数组名
    char *p = string;//指向字符数组首地址
    *(p+1) = 'v';//操作单个字符
    printf("%s",p + 1);//操作整个字符串
//输出vphone

指针数组

存放指针的数组为指针数组

eg:char *string[3] = {"ios","android","win8"};

    char *p1 = "iOS";
    char *p2 = "Android";
    char *p3 = "win8";
    char *string[3] = {p1,p2,p3};
    //char *string[3] = {"iOS","Android","win8"};
    for (int i = 0; i<3; i++) {
        printf("%s ",string[i]);
    }
    printf("
 %c",*(string[1]+4));//输出o
    printf("
 %c",string[1][4]);//输出o

可以用指针修改字符数组,但不可修改常量字符串

指针函数

void swap(int x,int y) {
    int temp = x;
    x = y;
    y = temp;
    printf("x = %d y = %d
",x,y);
}
void swap2(int *x,int *y)
{
    printf("---*x = %d,*y = %d",*x,*y);
    int temp = *x;
    *x = *y;
    *y = temp;
    printf("---*x = %d,*y = %d",*x,*y);
}
int main(int argc, const char * argv[])
{
    int a = 10,b = 20;
//    swap(a,b);
    swap2(&a, &b);
    
    printf("a = %d b = %d",a,b);

swap不能使a,b交换,,,swap2可以使a,b交换

原文地址:https://www.cnblogs.com/limicheng/p/3792288.html