c语言中&与*区别及在函数之间传递的具体用法

网上没找到类似的,加上自己对C语言的指针这块理解很不到位,走了很多弯路,试代码感觉理解对了,就把自己的理解敲一下,如果不对希望能指正一下

#include
#include

typedef int ElemType;
typedef  struct {   // 线性表中共有length个元素,是data[0]——data[length-1]
	int data[20];
	int length;
}SqList;
int initList(SqList *L)
{
	L->length = 0;
	return 1;
}
int printList(SqList L)
{
	if (L.length == 0)
	{
		printf("链表为空\n");
		return 0;
	}
	int i;
	for (i = 0; i < L.length; i++) {
		printf("data[%d] = %d\n", i, L.data[i]);
	}
	printf("\n");
	return 1;
}
int getlength(SqList L) {
	return L.length;
}
int createList(SqList *L, int length) {
	//srand(time(0));
	int i;
	/*
	for (i = 0; i < length; i++) {
		L->data[i] = rand() % 100;
		L->length++;
	}
	*/
	for (i = 0; i < length; i++) {
		printf("请升序输入链表的第%d个值", i+1);
		scanf_s("%d", &L->data[i]);
		L->length++;
	}

	return 1;
}

int insertList(SqList *L, int pos, ElemType elem) {
	int i;
	/*
	if (pos<1 || pos>L->length)
	{
		printf("插入的位置有误,无法插入数据\n");
		return 0;
	}
	*/
	
	for (i = L->length - 1; i >= pos - 1; i--)
	{
		L->data[i + 1] = L->data[i];
	}
	L->data[pos - 1] = elem;
	L->length++;
	return 1;
}
int getElem(SqList L, int pos, ElemType *e) {
	if (pos<1 || pos>L.length)
	{
		printf("查找位置有错误,无法获取指定位置的数据\n");
		return 0;
	}
	*e = L.data[pos - 1];
	return 1;
}
int locateElem(SqList L, ElemType e) {
	int i;
	for (i = 0; i < L.length; i++)
	{
		//printf("在%d层循环...\n",i);
		if (L.data[i] == e)
		{
			printf("在pos[%d]位置处,查找到了元素elem:%d\n", i + 1, e);
			return 1;
		}
	}
	return 0;
}
int deleteList(SqList *L, int pos, ElemType *elem) {
	int i;
	if (pos<1 || pos>L->length)
	{
		printf("删除的位置有误,无法从该位置删除数据\n");
		return 0;
	}
	*elem = L->data[pos - 1];
	for (i = pos; i < L->length; i++) {
		L->data[i - 1] = L->data[i];
	}
	L->length--;
	return 1;
}
int clearList(SqList L, SqList *pL) {
	//printf("In clearList function: %d\n", &L);
	//printf("In clearList function: %d\n", pL);
	L.length = 0;
	pL->length = 0;
	return 1;
}

void Dsort(SqList la, SqList lb, SqList *lc) {
	int i = la.length, j = lb.length, k = 0, ea = 0, eb = 0;
	//createList(lc, 2);
	while (i > 0 && j > 0) {
		getElem(la, i, &ea);
		getElem(lb, j, &eb);
		if (ea < eb) {
			++k;
			insertList(lc, k, eb);
			--j;
		}
		else if (ea > eb) {
			++k;
			insertList(lc, k, ea);
			--i;
		}
		else {
			--i;
		}
	}
	while (i > 0) {
		getElem(la, i--, &ea);
		insertList(lc, ++k, ea);
	}
	while (j > 0) {
		getElem(lb, j--, &eb);
		insertList(lc, ++k, eb);
	}
}

void main() {
	SqList La, Lb, Lc;
	initList(&La);
	initList(&Lb);
	initList(&Lc);
	createList(&La, 5);
	createList(&Lb, 6);
	Dsort(La, Lb, &Lc);

	printList(La);
	printList(Lb);
	printList(Lc);

	system("pause");
}

       上面是一段能运行的用线性表实现某功能的代码(具体不说避免关键字被搜索到),其中创建函数时lc参数前缀为*,lc的类型不同于main中的Lc,因为函数中lc为指针,该函数内将lc地址传给另一个函数时直接用名字不用加&,这与main中不同。

        函数间传地址还有另一种用法,如void creat(SqList &l),使用可以直接 creat(l),其中 l类型:SqList l。

 

你可能感兴趣的:(c语言中&与*区别及在函数之间传递的具体用法)