关于#c语言#的知识点:指针 数组相减 的疑惑

#include <stdio.h>
int main(void)
{
char ac [] = {0,1,2,3,4,5,6,7,8,9, };
char * p= &ac[0];
char *p1=&ac [5];
/*问题如下
1.我知道char *p=ac等价于char *p=&ac【0】;
但是
 char *p=ac等价于char *p=ac【0】吗?这两句话区别是&号。
  char *p=ac【0】char *p=&ac【0】这两句的意思一样吗?
*/

printf("p =%p\n", p);
printf ("p+1=sp\n" ,p+1);
printf("p1-p=%d\n",p1-p);
/*2.指针P等于数组里的0,指针p1等于4,
p1-p为什么不是4?
*/

int ai[]= {0,1,2,3,4,5,6,7,8,9,};
int *q = ai;
int *q1 = &ai[6];  //[6]=5?
printf("'q=%p\n", q);
printf ("q1=%p\n",q1);
printf("q1-q=%d\n”,q1-q);
return 0;
}


3 &ac【5】是第五个数字,也就是数组里的4。为什么课程里说&ac【0】至&ac【5】之间差了五?

4.(此问题已经解决)
我认为ac【0】代表数组中的0,ac【1】也代表数组里的0。第0个数和第一个数,这该怎么理解?我突然想不通了,这该怎么理解?
答:
向丹塞妍
int a[5];中的那个5表示这个数组最多可以包含五个元素,在引用的时候是a[0]~a4,这5个元素,至于a[5],对于这个定义是的使用是非法的,因为他使用了超出数组申请空间以外的空间,就好比使用了不属于自己的东西(使用别人的是违法的)。若你使用a[5]的话,不一定会出现什么效果,可能在你看来会是正常的效果,但实际上是不正常的行为。

img

img

内存示意图上该怎么理解呢?万分感谢解惑
5.csdn提问违禁词为什么有这个..

img

  1. char *p=ac和char *p=ac[0]都不用说是否等价,因为char p=ac[0]这个语句本身就是错的,ac[0]是char,但是p是char,不能相互赋值。
  2. 首先,你仔细数数,p1对应的是5。但是严格地说,p1-p是指针相减,与它们对应的值无关,指针相减获取的是两个指针之间间隔的元素个数(不是字节数),所以p1-p得5,因为它们间隔5个位置。
  3. 和上面一样,ac[5]是第6个数字,是5。
  4. 数组里,0是第一个数,1是第二个数,以此类推。
  5. 啊这……这也违禁……我也不知道啊😂

这个回答有帮助https://ask.csdn.net/questions/177903?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167523347916800215099277%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fask.%2522%257D&request_id=167523347916800215099277&biz_id=4&utm_medium=distribute.pc_search_result.none-task-ask_topic-2~ask~first_rank_ecpm_v1~ask_rank-1-177903-null-null.pc_ask&utm_term=%2ap%E5%92%8C%20p&spm=1018.2226.3001.4187