指针概念;数组指针、字符串指针、结构体指针、动态内存申请、指针数组;

指针概念指针内存结构:变量名->变量存的值(内存)->(内存)值的地址。

(1)指针变量*p:存的是指针(即地址)。指向:指针变量存的地址指向内存地址。(如:p=&a;)

(2)&取变量或内存地址。
   *①声明指针变量②访问变量所指内存。区别:①中最前面有数据类型。
(3)函数是一种预编译结构,使用完后,函数连同所生成的内存空间会被系统回收
(4)址传递的好处,解决函数只能返回一个返回值的问题。
通过修改指针变量存的地址,保持内存地址对应的值不变。(p=?)
或者改变内存地址对应的值,保持指针变量存的地址不变。(*p=?)
达到对内存任意操作的效果。
(5)指针操作字符更为方便,因为字符中有''。数组中没有结束标志,只有长度大小。
因此对数组操作常用for,对字符操作常用while。 
(6)函数返回值为空时,最好在函数内输出。通过指针修改值可在主函数内输出,若通过修改地址还是要在函数内输出。


(1)数组指针:即指向整形数组类型的指针。int a[2]={4,6};int *p;p=a;(p是变量,*(p+2)=a[2]。a是常量,因此a++是错误的)指针变量加1,其结果相当于加一个其指向的字节数。
(2)数组名字就是数组指针。数组名字指向数组的首个元素。a == &a[0];
(3)字符串指针:即指向字符数组类型的指针。char *p;p="ios";
(4)动态申请内存:指针变量存的地址=(类型*)malloc(sizeof(类型));作用:申请地址所指的内存。返回值:内存地址。
free(指针变量存的地址);作用:释放地址所指的内存空间。
strcmp(s1,s2);作用:比较字符串大小。返回值为-1,0,1。
(int)strlen();求数组(字符串)长度,返回值为长整形。
(5)结构体指针 (访问方式->)
结构体可以做传递参数和返回类型
(6)指针数组,即指针类型的数组。int * a[3]={,,};或char * str[3]={,,};(二级指针)。
void change1(int x,int y);
void change1(int x,int y)
{
    int tmp = 0;
    tmp = x;
    x = y;
    y = tmp;
}

void change2(int *x,int *y);
void change2(int *x,int *y)
{
    int tmp = 0;
    tmp = *x;
    *x = *y;
    *y = tmp;
}


int fun(int m,int n,int *c );
int fun(int m,int n,int *c )
{
    int r = m + n;
    *c = m - n;
    return r ;
}

int main(int argc, const char * argv[])
{   /*
    int i = 10,j = 3;
    
    int *p;//声明指针变量
    
    p = &i;//取i的地址赋值给p;
    printf("%d
",sizeof(p));
    printf("p所指内存中的数据是%d",*p);
    */
  /*
    //指针基础
    int a = 10,b = 20;
//    int tmp = 0;
//    tmp = a;
//    a = b;
//    b = tmp;
    
    //2传值和传址
    change1(a, b);
    printf("a = %d,b = %d
",a,b);
    change2(&a ,&b );
    printf("a = %d,b = %d
",a,b);
    
    */
    //3函数有多个返回值
    int m = 10,n =8;
    int z = 0;
    int result = fun(m, n, &z);
    printf("result = %d,z = %d
",result,z);
    return 0;
}

2

#include <stdlib.h>
#include <string.h>

struct point
{
    int x;
    int y;
};
typedef struct point xpoint;//重定义数据类型

int main(int argc, const char * argv[])
{
    /*
  //改址
  int a = 10,b = 20;
  int *x,*y,*temp;
  x = a;
  y = b;
  temp = x;
  x = y;
  y = temp;
  printf("%d,%d ",*x,b);
    //数组指针
    int arr[] = {1,3,6,8,12};  
    int *p;
    p = arr;
    p++;    //指针偏移
    printf("*p = %d
",*p);
    
    
    p = arr;
    for(int i = 0;i < 5;i++)
    {
        printf("%d	",*(p+i));
    }
    printf("
");
    
//    p = arr;
//    while (p != NULL) { //没有结束标记,结果出错
//        printf("%d	",*p);
//        p++;
//    }
    
    //字符串
     char *str = "hello ios";
    printf("str = %s 
",str);
    
    char a[] = "hello mac";
    char *q = a;
    printf("*q = %s
",q);
    
    char *str1;
    str1 = "hello";
    //*str1 = "hello";
    printf("str1 = %s",str1);//字符的实质是数组
    
//    int *p_1;  //出错
//    scanf("%d",p_1);
//    printf("%d
",*p_1);
    */
    /*
    //申请内存
    int *z;
    z = malloc(sizeof(int));
    scanf("%d",z);
    printf("*z = %d
",*z);
    
    //释放
    free(z);
    
    //字符指针申请内存
    char *str2;
    str2 = malloc(sizeof(char)*10);
    scanf("%s",str2);
    printf("str2 = %s",str2);
    
//    char s1[30] = "SHANGHAI",s2[30] = "JINAN";
//    printf("%d",strcmp(strcpy(s1, s2), s2));
    */
    /*
    //结构体
    xpoint p1 = {3,5};
    printf("x:%d,y:%d
",p1.x,p1.y);
    
    //结构体指针,访问方式不一样
    xpoint *l = &p1;
    printf("x:%d
",l->x);     //通过指针访问变量
    printf("y:%d
",l->y);
    */
    //指针数组
    char * str[3] = {"phone","android","hello"};
    for (int i = 0; i < 3; i++) {
        printf("%s
",str[i]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/huen/p/3488903.html