Originariamente inviato da Who am I
Ma si può scavalcare questa cosa? Hai parlato di keyword fatte per specificare l' aliasing, e se io dichiaro il puntatore di tipo register?
register non c'entra una mazza (e tra l'altro ormai sui compilatori recenti è praticamente un no-op), semmai volatile concettualmente potrebbe c'entrare, ma dal punto di vista dello standard è assolutamente irrilevante, non ci sono eccezioni sostanziali alla regola oltre ai char *.
Perché in certi casi farebbe comodo avere un puntatore a int a un buffer di char.
Nella mia esperienza una cosa del genere comunque funziona, dato che il "type punning" fatto in quella maniera su un buffer di char si fa spesso e i compilatori sono tolleranti a questa roba - ma attenzione ai problemi di alignment! Su architettura x86 si fa presto a disinteressarsene (dato che un accesso non allineato si traduce semplicemente in un calo di prestazioni), ma su molte altre architetture cercare di leggere un intero da un buffer di char non allineato correttamente produce un'eccezione hardware.
Da questo momento in poi non posso mai leggere arr_i[0]?
Dovresti prima scrivere in arr_i[0]; ma di nuovo, in genere i compilatori consentono il type punning via union, leggiti ad esempio la documentazione dell'opzione -fstrict-aliasing di g++.