指针概念;数组指针、字符串指针、结构体指针、动态内存申请、指针数组;
指针概念指针内存结构:变量名->变量存的值(内存)->(内存)值的地址。
(1)指针变量*p:存的是指针(即地址)。指向:指针变量存的地址指向内存地址。(如:p=&a;)
(2)&取变量或内存地址。
*①声明指针变量②访问变量所指内存。区别:①中最前面有数据类型。
(3)函数是一种预编译结构,使用完后,函数连同所生成的内存空间会被系统回收
(4)址传递的好处,解决函数只能返回一个返回值的问题。
通过修改指针变量存的地址,保持内存地址对应的值不变。(p=?)
或者改变内存地址对应的值,保持指针变量存的地址不变。(*p=?)
达到对内存任意操作的效果。
(5)指针操作字符更为方便,因为字符中有'\0'。数组中没有结束标志,只有长度大小。
因此对数组操作常用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\n",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\n",a,b); change2(&a ,&b ); printf("a = %d,b = %d\n",a,b); */ //3函数有多个返回值 int m = 10,n =8; int z = 0; int result = fun(m, n, &z); printf("result = %d,z = %d\n",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\n",*x,b);
//数组指针 int arr[] = {1,3,6,8,12}; int *p; p = arr; p++; //指针偏移 printf("*p = %d\n",*p); p = arr; for(int i = 0;i < 5;i++) { printf("%d\t",*(p+i)); } printf("\n"); // p = arr; // while (p != NULL) { //没有结束标记,结果出错 // printf("%d\t",*p); // p++; // } //字符串 char *str = "hello ios"; printf("str = %s \n",str); char a[] = "hello mac"; char *q = a; printf("*q = %s\n",q); char *str1; str1 = "hello"; //*str1 = "hello"; printf("str1 = %s",str1);//字符的实质是数组 // int *p_1; //出错 // scanf("%d",p_1); // printf("%d\n",*p_1); */ /* //申请内存 int *z; z = malloc(sizeof(int)); scanf("%d",z); printf("*z = %d\n",*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\n",p1.x,p1.y); //结构体指针,访问方式不一样 xpoint *l = &p1; printf("x:%d\n",l->x); //通过指针访问变量 printf("y:%d\n",l->y); */ //指针数组 char * str[3] = {"phone","android","hello"}; for (int i = 0; i < 3; i++) { printf("%s\n",str[i]); } return 0; }