void pointer c语言,C语言-Pointer

这篇博客详细介绍了C语言中的指针概念,包括指针变量的声明、赋值、算术运算以及指针与数组的关系。通过示例展示了如何使用指针遍历数组并进行冒泡排序。此外,还探讨了指针与字符串、指针数组以及指针函数的应用。文章强调了指针变量的内存大小与数据类型无关,但赋值时必须匹配。最后,提到了指针与数组的区别,指出数组名是常量,不可重新赋值。
摘要由CSDN通过智能技术生成

//main.m

#import

#import "Array.h"

#import "Change.h"

int main(int argc, const char * argv[])

{

//定义指针变量

// int a = 10;

// float b = 5.0;

// char c = 'a';

// a = 20;

// printf("%d\n",a);

//

// int *p = NULL;

// //定义了一个数据类型为 int* 变量名为 p 初始值为 NULL 的一个指针变量

// //指针变量是一个存储了地址的变量

// //int * 为数据类型;

// //int 指的是 p 需要指向一个整型的变量(存储的是整型变量的地址);

// // * 是告知变量 p 是一个指针;

// // NULL 指的是一个无效的地址空间,赋初值;

// //指针变量的存储空间大小和系统有关,64位系统下是8个字节;

//

// printf("%lu %lu",sizeof(int *),sizeof(p));

// //指向浮点型的地址

// float *p_1 = NULL;

// printf("%lu %lu",sizeof(float *),sizeof(p_1));

// //指向字符型的地址

// char *p_2 = NULL;

// printf("%lu %lu",sizeof(char *),sizeof(p_2));

//

// & : 取地址符

// p = &a; //将 a 的地址赋值给 p, 那么 p 指向 a

// p_1 = &b; //将b 的地址赋值给 p_1 ,那么p 指向 b

//

// printf("\np = %p, a的地址%p",p,&a); //打印后 p 等于 a 的地址

//

// // * : 取值符 (获取对应地址的值,当然也可以对对应地址内存赋值)

// // 关于取值还是赋值 根据"="来判定,,=左赋值

// printf("\n a = %d , *p = %d",a ,*p);

// *p = 40;

// printf("\n%d",a);

//

// //*(&a) * 和 & 是一对相反互逆的过程符号

// printf("a = %d",*(&a));

//

//指针变量的算术运算

// int a = 1;

// int *p = &a;

// printf("p = %p\n",p);

// //对指针一次性改变的增量跟指向的数据类型有关,比如 int 一次 4个字节

// p++;

// printf("p = %p\n",p);

//

//

// char c = 'a';

// char *p_1 = &c;

// printf("p_1 = %p\n",p_1);

// p_1++;

// printf("p_1 = %p\n",p_1);

// p_1 = p_1 - 2;

// printf("p_1 = %p\n",p_1);

// p = p - 2;

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

//

//重指向

// int num = 0;

// p = #

//

//指针与数组

// int a[5] = {1,2,3,4,5};

// int *p =NULL;

//

// printf("a = %p,&a[0] = %p\n",a,&a[0]);

// p = a; //因为数组名代表数组的首地址,我们将a 赋值给 p 就是将数组的首地址给 p,p 就指向数组 a

//

// //访问数组第2个元素

// a[1];

// *(p + 1);

// *(a + 1);

// p[1]; //如果指针变量指向数组,那么指针变量可以当做数组名来使用.

// printf("%d,%d,%d",a[1],*(p+1),*(a+ 1),p[1]);

// // a[1] 与 1[a] 同样表示

// // a[1] == *(a + 1) == *(1 + a) ==1[a]

//

//

//

// //使用指针变量 p 对数组 a 进行遍历输出

// for (int i = 0; i < 5; i++) {

// printf("%d ",*(p + i)); //或者 *(p + i) 替换成 p[i].

// }

//

// //使用指针变量进行冒泡排序

//

// for (int i = 0; i < 5 - 1 ; i++) {

// for (int j = 0; j < 5 - 1 -i; j++) {

// if (*(p + j) > *(p + j + 1)) {

//

// int o = *(p + j);

// *(p + j) = *(p + j + 1);

// p[j + 1] = o;

// }

// }

//

//

// }

//

// for (int i = 0; i < 5; i++) {

// printf("%d ",p[i]);

// }

//

//

//

//指针和数组的区别

// int a[5] = {1,2,3,4,5};

// int *p =NULL;

//

// //内存大小

// //数组的内存大小 = 每个元素内存大小 * 数组元素个数

// //指针内存大小只和操作系统有关,跟指向的数据类型无关

// p = a;

// printf("a size = %lu , p size = %lu",sizeof(a),sizeof(p));// 20 , 8

//

// //赋值

// //指针变量是一个变量,可以重新赋值

// //数组名,是一个常量,表示第一个元素,不可以赋值

// int b[10] = {0};

// p = b;

// //a = b; 是错误的

//

// short c[5] = {2,3,4,5};

// int *p_1 =NULL;

// short *p_2 = NULL;

// char *p_3 = NULL;

//

// //指针变量存储的变量地址的数据类型一定要匹配,

// p_1 = c;

// p_2 = c;

// p_3 = c;

// printf("\np_1[0] = %d,p_2[0] = %d,p_3[0] = %d",*p_1,*p_2,*p_3);

//指针和字符串的关系

// char ch[20] = "iphone6";

// char *p = ch; //p 指向 ch数组

//

// for (int i = 0; i < 20 ; i++) {

// printf("%c ",*(p+i));

// }

// printf("\n%s",p);

//

// printf("%d ",myStrlen(p));

//

//

//

//指针数组

// char ch_1[20] ="iOS";

// char ch_2[20] ="C++";

// char ch_3[20] = "C++++";

// char ch_4[20] = "java";

//

// char *ch[4] = {ch_1,ch_2,ch_3,ch_4};

//

// //遍历指针数组

// for (int i = 0; i < 4; i++) {

// printf("%s ",ch[i]);

// }

//

//

//

// char *p_1 = "iOS";

// char *P_2 = "C++";

// char *p_3 = "C++++";

// char *p_4 = "java";

//

//

//

//

// strcpy(p_1, "aa");//其实在这个时候 p 直接指向常量区的字符串或者数字,是不可以改变的

// //如果在上面 式子中,先把"iOS"给了数组,数组内容中的"iOS"是从常量中拷贝而来的,所以如果去改变指向变量的话,可以做到

// char a[80]="jasdofiewofnaidshadfkjagoiasdfewnjfsdioucasmfbh";

// char *p_5 ="jasdofiewofnaidshadfkjagoiasdfewnjfsdioucasmfbh";

// //以上两个用法是都可以实现的,因为 p_5指向的是这个字符串,完全不用考虑因数组越界的问题了.

//

//指针函数

// int a = 5;

//

//

// changenum(a);

// printf("a = %d",a);

//

// changenumber(&a);

// printf("a = %d",a);

//

//

return 0;

}

//  Change.h/Change.m

Change.h

#import

void changenum(int a);

//void changenumber(int *a);

Change.m

#import "Change.h"

void changenum(int a){

a += 10;

}

//void changenumber(int *a){

// *a += 10;

//}

//

//Array.h/Array.m

#import

//求长度

int myStrlen(char *p);

#import "Array.h"

//求长度

int myStrlen(char *p){

//计数器

int count = 0;

int i = 0;

while (*(p + i) != '\n') {

count++;

i++;

}

return count;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值