目录
指针应用
-
函数参数传递(更快,更节约内存空间)
-
int (4Bytes) int * (4Bytes)
-
MyClass (255550Bytes) Myclass * (4Bytes)
-
跨函数的值修改(地址传递)
-
数组(常量指针)
-
数据结构
-
最多2级指针
-
void* 万能指针 配合mempy()完成任意类型交换
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void swap(void* lhs, void* rhs, size_t sz)
{
void *temp = malloc(sizeof(sz));
memcpy(temp, rhs, sizeof(sz));
memcpy(rhs, lhs, sizeof(sz));
memcpy(lhs, temp, sizeof(sz));
free(temp);
}
int main()
{
/*指针应用:
1.函数参数传递(更快,更节约内存空间)
int (4Bytes) int * (4Bytes)
MyClass (255550Bytes) Myclass * (4Bytes)
2.跨函数的值修改(地址传递)
3.数组(常量指针)
4.数据结构
5.最多2级指针
6.void* 万能指针 配合mempy()完成任意类型交换*/
int num = 12, other = 40;
float fNum = 1.570, fOther = 5.068;
double dNum = 32.750, dOther = 69.054;
swap(&num, &other, sizeof(int));
swap(&fNum, &fOther, sizeof(float));
swap(&dNum, &dOther, sizeof(double));
printf("%-15d %-15d\n", num, other);
printf("%-15f %-15f\n", fNum, fOther);
printf("%-15lf %-15lf\n", dNum, dOther);
/*strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy*/
}
void指针的意义
C语言规定只有相同类型的指针才可以相互赋值
void*指针作为左值用于“接收”任意类型的指针
void*指针作为右值赋值给其它指针时需要强制类型转换
int *p1 = NULL;
char *p2 = (char *)malloc(sizoeof(char)*20);
关于数组名
- 数组首元素的地址和数组地址是两个不同的概念
- 数组名代表数组首元素的地址,它是个常量。
- 解释如下:变量本质是内存空间的别名,一定义数组,就分配内存,内存就固定了。所以数组名起名以后就不能被修改了。
- 数组首元素的地址和数组的地址值相等
- 怎么样得到整个一维数组的地址?
C语言规定:
int a[10];
printf("得到整个数组的地址a: %d \n", &a);
printf("数组的首元素的地址a: %d \n", a);
strcpy和memcpy的区别
-
复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
-
复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
-
用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。