指针(大小比较)等

 我是由下面的例子来理解的:


顺序表的插入算法

status ListInsert(List *L,int i,ElemType e) {

struct STU *p,*q;

if (i<1||i>L->length+1) return ERROR;

q=&(L->elem[i-1]);

for(p=&L->elem[L->length-1];p>=q;--p)//1.注释

*(p+1)=*p;

*q=e;

++L->length;

return OK;

}/*ListInsert Before i */

 /1.注释:P>=q此时是比较PQ指向的地址空间位置及存放数据的位置是否相等。位置当然是32位进制的了,.指针变量无非就是一个表示内存地址的长整数而已,指向同一个数组时,两个指针的大小就表示谁指向的元素靠前或靠后。如果不是指向同一个数组,比较大小就只能看出谁指向的内存空间地址较小,没什么意义。指针是一个变量,它存放的是内存地址
例如:int *p
其中,p的值就是*p指向的内存的地址,&p就是放在p这个内存地址中的数值,这个显然是int型的变量









顺序表的合并算法

void MergeList(List *La,List *Lb,List *Lc) {

ElemType *pa,*pb,*pc,*pa_last,*pb_last;

pa=La->elem;pb=Lb->elem;

Lc->listsize = Lc->length = La->length + Lb->length;

pc = Lc->elem =

(ElemType *)malloc(Lc->listsize * sizeof(ElemType));

if(!Lc->elem) exit(OVERFLOW);

pa_last = La->elem + La->length - 1;

pb_last = Lb->elem + Lb->length - 1;

while(pa<=pa_last && pb<=pb_last) {

if(Less_EqualList(pa,pb)) *pc++=*pa++;

else *pc++=*pb++;

}

while(pa<=pa_last) *pc++=*pa++;

while(pb<=pb_last) *pc++=*pb++;

}

### C/C++ 中指针大小比较的相关规则 在 C/C++ 编程语言中,指针是一种特殊的变量类型,用于存储内存地址。然而,在某些情况下可能需要对两个指针进行大小比较。以下是关于指针大小比较的一些重要规则和注意事项: #### 1. **相同类型的指针可以进行比较** 只有当两个指针指向同一数据类型时,才能合法地对其进行大小比较。这是因为不同类型的指针可能会有不同的表示方式或长度[^4]。 ```cpp int a = 10, b = 20; int *p1 = &a, *p2 = &b; if (p1 < p2) { printf("Pointer p1 is less than p2.\n"); } ``` 上述代码片段展示了如何安全地比较两个 `int` 类型的指针。 --- #### 2. **指针比较仅限于同一个数组范围内** 对于数组中的元素,其对应的指针可以在一定条件下进行比较。这种比较通常发生在指针位于同一个数组范围内的场景下。超出该范围可能导致未定义行为。 ```cpp int arr[5]; int *start = arr; int *end = arr + 5; if (start < end) { printf("Start pointer is before the end of array.\n"); } else { printf("Invalid comparison or out-of-range access.\n"); } ``` 注意:如果尝试跨多个不连续分配的对象进行指针比较,则会触发未定义行为[^1]。 --- #### 3. **不同类型指针之间的比较不可靠** 尽管可以通过强制类型转换来实现不同类型指针间的比较,但这并不意味着这样的操作总是有意义或者可靠。由于每种数据类型的底层结构可能存在差异,因此建议避免此类做法。 ```cpp short s_val = 10; float f_val = 20.5f; // 不推荐的做法 if ((void*)&s_val < (void*)&f_val) { printf("Short value address is smaller.\n"); } ``` 这里虽然能够运行并得出结果,但实际上违反了良好的编程实践原则。 --- #### 4. **NULL 指针特殊处理** 任何有效的非 NULL 指针都大于 NULL 指针。这是因为在大多数平台上,NULL 被定义为零值地址。 ```cpp int var = 42; int *ptr = &var; if (ptr > nullptr || ptr != NULL) { // 正确逻辑判断 } ``` 需要注意的是,直接将数值与指针相加减会产生错误的结果,除非明确知道目标平台上的具体实现细节。 --- #### 5. **使用 sizeof 运算符获取指针本身的字节宽度** 通过 `sizeof()` 可以测量各种类型指针所占用的空间大小。无论指针实际指向何种对象,它们自身的尺寸通常是固定的(取决于体系架构)。例如,在常见的 x86_64 架构上,所有指针均为 8 字节宽[^5]。 ```cpp char ch = 'A'; double dbl = 3.14; printf("Size of char*: %zu\n", sizeof(&ch)); printf("Size of
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值